たとえば、次のような2つの関数を持つC++クラスがあるとします。
class MyClass
{
bool Foo(int val);
bool Foo(string val);
}
このような三項演算子を使用することは可能ですか?
MyClassInstance->Foo(booleanValue?24:"a string");
?MyClass
の値に応じて呼び出される関数が異なります。booleanValue
たとえば、次のような2つの関数を持つC++クラスがあるとします。
class MyClass
{
bool Foo(int val);
bool Foo(string val);
}
このような三項演算子を使用することは可能ですか?
MyClassInstance->Foo(booleanValue?24:"a string");
?MyClass
の値に応じて呼び出される関数が異なります。booleanValue
三項演算子ではありません。三項式の型は、その 2 番目と 3 番目のオペランドの共通の型です。共通の型がない場合は使用できません。したがって、通常のif
ステートメントを使用してください。
if (booleanValue)
MyClassInstance->Foo(24);
else
MyClassInstance->Foo("a string");
三項条件式の型は、両方のオペランドが変換可能な共通型 two です。あなたが示唆しているように、「動的オーバーロード解決」を実行することは絶対にできません。
int
andには共通の型がないためchar const *
、コードはコンパイルされません (これをテストしたときに確実に気づいたように)。
(三項条件が使用されているのは、まさにこれらのセマンティクスのために、std::common_type
トレイト クラス テンプレートの実装とdecltype
.
(条件が のように静的に知られている場合、テンプレートの特殊化を使用して、条件付きオーバーロードの解決を実行する似たようsizeof(int) != 7
なコードを記述できますが、もちろん静的です。)
いいえ。オーバーロードの解決を実行するために、コンパイラは「の型はbooleanValue?24:"a string"
何ですか?」と尋ねます。その質問には答えられません。
いいえ、これは許可されていません。
オーバーロードはコンパイル時であるため、実行時にそのように動作することはできません。
まさにそれをしたいコードでは一般的ではありませんが、iostream では次のようなことをしたい場合があります。
os << ( condition ? var1 : var2 )
ここで、var1 と var2 の型は異なります。それもうまくいきません。
あなたがすることができます:
MyClassInstance->Foo( booleanValue ? boost::any(24) : boost::any("a string") );