如何使类作为printf_s / sprintf_s的字符串工作

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

本文关键字:sprintf 字符串 工作 何使类 printf      更新时间:2023-10-16

我想创建一个类,让我们说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()成员或其他成员。