我有限定的用户定义的运算符用于TCHAR *,像这样

的一类
CMyClass::operator const TCHAR*() const
{
    // returns text as const TCHAR*
}

我希望能够做这样的事情。

CMyClass myClass;
_tprintf(_T("%s"), myClass);

或甚至

_tprintf(_T("%s"), CMyClass(value));

但是,试图时,总是printf的打印(空)代替的值。我也尝试了正常的char *运营商,以及与常量等的变化 它只是正常工作,如果我显式调用操作或做一个演员,像

_tprintf(_T("%s\n"), (const TCHAR*)myClass);
_tprintf(_T("%s\n"), myClass.operator const TCHAR *());

不过,我不想投。如何才能实现这一目标?

请注意,这可能是创建具有常量TCHAR *的参数的功能,使其强制调用操作TCHAR *,但我也不想实施。

有帮助吗?

解决方案

避免转换运算符。他们很少这样做你想要什么,然后显式调用是痛苦的。重命名operator const TCHAR*() constTCHAR *str() const

其他提示

在C ++标准说,像这样的隐式转换不会应用于省略号参数 - 如何将编译器知道学以致用转换?你必须明确地执行转换自己,或更好,但停止使用printf的。

转换运算符被调用时,编译器想要将值转换为另一种类型。这项功能对需要特定类型的定义参数的功能。它不会像在函数声明printf() ...可变参数职能的工作。这些函数的参数,然后使用它们,所以转换运算符不会被调用。

要具体地,当编译器看到printf("%s", foo),它通过foo,不管是什么,对printf(),这将不得不假设它是适合,因为它是一个%s格式。没有转换运算符将被称为(尽管某些算术优惠将发生)。

在一般导致问题转换运算符。通过具有在类运营商,你复杂的函数重载解析,因为编译器能够解释的CMyClass就好像它是一个TCHAR *。这可能会导致意想不到的结果,或者导致代码编译的时候,你真的不想要它,或者选择了错误的重载函数。 (例如,给定CMyClass cmc;,表达cmc + 10是突然合法,由于是TCHAR * + int完全合法的指针运算。)通常的做法是标记这种转换explicit

铸造是,如果你想用printf风格的API,并依赖于一个转换操作符(和我不打算在这里你争论是否应该使用这些功能)做正确的事。不过,我会用静态铸造,例如_tprintf(_T("%s\n"), static_cast<const TCHAR*>(myClass));

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top