2012-10-24 23 views
8

のは、私が三項演算子と関数のシグネチャ

class MyClass 
{ 
    bool Foo(int val); 
    bool Foo(string val); 
} 

のような二つの機能を持つC++クラスは、それがこの

MyClassInstance->Foo(booleanValue?24:"a string"); 

のような三項演算子を使用してMyClassの異なる機能を持つことが可能です持っていると言いますbooleanValueの値に応じて呼び出されますか?

+2

、これは興味深いです... – mauris

+6

はあなたがコンパイルし、それが何が起こるかを確認するために実行してみましたがありますか? –

+0

これはコンパイルされません。コンパイラは三項演算子の異なる型について不平を言うでしょう。 –

答えて

21

三項演算子ではありません。三項式の型は、その第2および第3オペランドの共通の型です。共通のタイプがない場合は使用できません。だから普通のifステートメントを使用します。

if (booleanValue) 
    MyClassInstance->Foo(24); 
else 
    MyClassInstance->Foo("a string"); 
5

いいえ。オーバーロードの解決を実行するために、コンパイラは "booleanValue?24:"a string"の種類は何ですか?"と尋ねます。その質問に答えることはできません。

+0

コンパイル時には答えられません*(私の下降投票ではありません - 回答を改善するためのちょっとした提案を書いています) –

+0

@Paul C++式は、時間。他のことについて話すのは意味がありません。 –

+0

はい、私は知っている点は、あなたが動的に、つまり実行時に呼び出す関数を決定することができると考えられますが、C++ではコンパイル時にその型を知る必要があるということです。 –

7

三条件式の型は、両方のオペランドが詐欺­ ­版tibleている一般的なタイプ2です。あなたは間違いなくではなく、が「動的過負荷解決」を実行できることを示唆しているようです。

intchar const *の共通タイプは存在しないので、コードはコンパイルされません(これはテストしたときに確かに認識されています)。

(あなたが三条件が一緒にdecltypeで、std::common_type形質クラステンプレートの実装であるため、これらのセマンティクスを正確に使用されていることを知って興奮かもしれません。)

(条件は静的が知られている場合このようなsizeof(int) != 7として、あなたはが静的​​もちろんの、は条件付きオーバーロードの解決を実行しないことと類似に見えるコードを記述する­ CIA ­ lizationテンプレートのSPEを使用することができます。)

5

いいえ、これは許可されていません。

オーバーロードはコンパイル時であるため、実行時にそのように動作することはできません。

は、あなたがしかし、時にはような何かをしたいという願望があるのiostreamと、まさにそれしたいと思うのコードでは一般的ではありません:VAR1とVAR2はさまざまな種類があり

os << (condition ? var1 : var2)

。それも機能しません。

あなたは行うことができます:

MyClassInstance->Foo(booleanValue ? boost::any(24) : boost::any("a string"));