Если вы перегрузите его с помощью operator const char*
, вы можете явным образом привести его:
MyClass name = "everyone";
printf_s("Hello %s!", (const char*)name);
// prints "Hello everyone!"
И тогда он будет вести себя правильно.Он не работает неявно, потому что printf
может принимать любой тип параметра после первого, поэтому компилятор не знает, к чему его приводить.
Это предполагает, конечно, что operator const char*
вашего класса возвращает строку в стиле C everyone
.
Как отметил в комментариях Томалак Гереткал, если сделать ваш класс неявно преобразуемым в const char*
, это может вызвать много проблем, поскольку он может сам себя привестибез вашего ведома.
Как и указал Kerrek SB, вероятно, не стоит делать ваш класс совместимым с printf
, поскольку в конце концов это C ++.Было бы лучше написать перегрузку operator<<
для 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!"