3

TCHAR* のユーザー定義演算子を定義したクラスがあります。

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

みたいなことができるようになりたい

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

あるいは

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

しかし、試してみると、printf は常に値の代わりに (null) を出力します。また、通常の char* 演算子や、const などのバリエーションも試しました。演算子を明示的に呼び出すか、次のようにキャストした場合にのみ正しく機能します。

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

しかし、私はキャストしたくありません。これはどのように達成できますか?

const TCHAR* のパラメーターを持つ関数を作成して、演算子 TCHAR* を強制的に呼び出す可能性があることに注意してください。ただし、これも実装したくありません。

4

4 に答える 4

9

C ++標準では、このような暗黙の変換は省略記号パラメーターには適用されないとされています。コンパイラーは、どの変換を適用するかをどのように知るのでしょうか。自分で明示的に変換を実行する必要がありますが、printfの使用を停止することをお勧めします。

于 2010-03-21T10:35:35.903 に答える
2

変換演算子は避けてください。彼らが望むことをすることはめったになく、明示的な呼び出しは苦痛です。に名前を変更operator const TCHAR*() constTCHAR *str() constます。

于 2010-03-21T18:56:24.017 に答える
1

変換演算子は、コンパイラが値を別の型に変換する必要があるときに呼び出されます。これは、特定の型の定義済みパラメーターを受け取る関数で機能します。関数宣言のようprintf()な可変引数関数では機能しません。...これらの関数は引数を受け取り、それらを処理するため、変換演算子は呼び出されません。

具体的には、コンパイラがを参照すると、それが何であれprintf("%s", foo)、 を に渡します。これは、そのままの形式に適していると想定する必要があります。変換演算子は呼び出されません (ただし、特定の算術昇格は行われます)。fooprintf()%s

一般に、変換演算子は問題を引き起こします。CMyClassそのクラスにその演算子を含めると、コンパイラが a を aであるかのように解釈できるため、関数のオーバーロードの解決が複雑になりますTCHAR *。これにより、意図しないときにコードがコンパイルされたり、間違ったオーバーロードされた関数が選択されたりして、予期しない結果が生じる可能性があります。(たとえば、 が与えられた場合、は完全に正当なポインター演算であるためCMyClass cmc;、式cmc + 10は突然正当になります。) 通常、このような変換は とラベル付けされます。TCHAR * + intexplicit

于 2010-03-22T19:29:55.293 に答える
0

printfスタイルのAPIを使用し、変換演算子に依存する場合は、キャストが適切です(これらの機能を使用する必要があるかどうかについては、ここでは説明しません)。ただし、静的キャストを使用します。_tprintf(_T("%s\n"), static_cast<const TCHAR*>(myClass));

于 2012-08-14T07:55:00.763 に答える