开发者

How to make a class work as string for printf_s / sprintf_s?

开发者 https://www.devze.com 2023-04-01 17:15 出处:网络
I\'m trying to make a class, let\'s say MyClass, work under the foll开发者_StackOverflow中文版owing condition:

I'm trying to make a class, let's say MyClass, work under the foll开发者_StackOverflow中文版owing condition:

MyClass name = "everyone";   // Assigns "everyone" into a local string variable.
printf_s("Hello %s!", name); // Should output "Hello everyone!" without the quotes.

I've tried overloading operator const char*() as well as operator char*() but neither seem to do the trick.


If you overload it with operator const char*, you can explicitly cast it:

MyClass name = "everyone";
printf_s("Hello %s!", (const char*)name);
// prints "Hello everyone!"

And then it will behave properly. It doesn't work implicitly becase printf can take any type of parameter after the first one, so the compiler has no idea what to try to cast it to.

This assumes, of course, that operator const char* of your class returns the C-style string everyone.

As Tomalak Geret'kal noted in the comments, making your class implicitly castable to const char* could cause a lot of problems because it can cast itself without you knowing/wanting it to.

As Kerrek SB also pointed out, it's probably not worth making your class compatible with printf, since this is C++ after all. It would be better style to write an operator<< overload for ostream&s:

ostream& operator<<(ostream& rhs, const MyClass& c) {
    rhs << c.name; // assuming the argument to the constructor
                   // is stored in the member variable name

    return rhs;
}

MyClass name = "everyone";
cout << "Hello " << name << '!';

// prints "Hello everyone!"


You cannot "detect" the intention of being converted to a char const* when being passed into an ellipsis (...). Your object will just be put on the stack and you'll probably crash. This is different than if your object is passed in to a function that explicitly takes a char const*, in which case an implicit conversion operator can be triggered.

I would recommend going the same route as the standard library and rely as little as possible on implicit conversions. Instead, use a c_str() member or something.

0

精彩评论

暂无评论...
验证码 换一张
取 消