質問

私はそう

のように、TCHAR *のためのユーザー定義演算子を定義したクラスを持っています
CMyClass::operator const TCHAR*() const
{
    // returns text as const TCHAR*
}

私のような何かを行うことができるようにしたい。

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

あるいは

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

しかししようとしたとき、printf関数は常にプリント(ヌル)の代わりに、値。 IもCONST等とよく変化として、通常のchar *オペレータを試みました 私は明示的にオペレータに電話するかのように、キャストを行う場合にのみ正しく動作します。

_tprintf(_T("%s\n"), (const TCHAR*)myClass);
_tprintf(_T("%s\n"), myClass.operator const TCHAR *());
しかし、私は、キャストにはしたくありません。どのようにこれを達成することができますか?

可能性は*ので強制通話オペレータTCHARこと、CONST TCHAR *のパラメータを持つ関数を作成することですが、この私も実装する必要はありません。

こと

注、

役に立ちましたか?

解決

避け変換演算子。彼らはほとんどあなたがやりたいことなく、明示的な呼び出しが痛いです。 operator const TCHAR*() constTCHAR *str() constの名前を変更します。

他のヒント

どのようにどのような変換が適用されるコンパイラを知っているだろう -

C ++標準では、このような暗黙の型変換が省略記号のパラメータに適用されていないと言っていますか?あなたは明示的に自分で変換を実行するか、いっそのprintfの使用を停止する必要があります。

コンパイラは別の型に値を変換したい場合、

は変換演算子が呼び出されます。これは、特定の種類の定義されたパラメータを取る機能のために働きます。これは、関数宣言にprintf()...のような可変引数の機能は動作しません。これらの関数は引数を取り、その後、彼らとの仕事なので、変換演算子が呼び出されることはありません。

コンパイラはprintf("%s", foo)を見たときに具体的には、それがあるとして、それはfoo形式に適していますと仮定しなければならないであろう、printf()に、それが何であれ、%sを渡します。いいえ変換演算子は、(特定の算術キャンペーンが行われるが)と呼ばれません。

一般的な原因の問題では

変換演算子。それはCMyClassであるかのように、コンパイラがTCHAR *を解釈することができるので、そのクラスにその演算子を持つことにより、あなたは、関数のオーバーロードの解決を複雑にしてきました。これは、どちらかあなたが本当にそれはしたくなかったときのコードがコンパイルさせる、または間違ったオーバーロードされた関数を選択し、予期しない結果を引き起こす可能性があります。 (例えば、CMyClass cmc;所与、発現cmc + 10TCHAR * + intは完全に正当なポインタ演算であるので、急に合法である。)通常の実施は、このような変換のexplicitを標識することである。

キャストを使用すると、printfのスタイルのAPIを使用したい場合の対処や変換演算子に頼るには正しいことである(と私はあなたがこれらの機能を使用する必要があるかどうかをここで議論するつもりはありません)。しかし、私は例えば、静的なキャストを使用します_tprintf(_T("%s\n"), static_cast<const TCHAR*>(myClass));

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top