如何使类作为printf_s / sprintf_s的字符串工作
How to make a class work as string for printf_s / sprintf_s?
我想创建一个类,让我们说MyClass,在以下条件下工作:
MyClass name = "everyone"; // Assigns "everyone" into a local string variable.
printf_s("Hello %s!", name); // Should output "Hello everyone!" without the quotes.
我试过重载操作符const char*()以及操作符char*(),但似乎都没有做到这一点。
如果你用operator const char*
重载它,你可以显式地强制转换它:
MyClass name = "everyone";
printf_s("Hello %s!", (const char*)name);
// prints "Hello everyone!"
然后它就会正常运行。它不能隐式地工作,因为printf
可以接受第一个参数之后的任何类型的参数,所以编译器不知道该尝试将其强制转换为什么。
当然,这假设你的类的operator const char*
返回c风格的字符串everyone
。
正如Tomalak Geret'kal在评论中指出的那样,让你的类隐式地强制转换为const char*
可能会导致很多问题,因为它可以在你不知道或不希望它这样做的情况下强制转换自己。
正如Kerrek SB也指出的那样,让你的类与printf
兼容可能是不值得的,因为这毕竟是c++。为ostream&
s写一个operator<<
重载会更好:
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!"
当传递给省略号(…)时,您无法"检测"转换为char const*的意图。你的对象会被放到堆栈上,你可能会崩溃。这与将对象传递给显式接受char const*
的函数不同,在这种情况下可以触发隐式转换操作符。
我建议采用与标准库相同的路线,并尽可能少地依赖隐式转换。相反,使用c_str()
成员或其他成员。