假设我有一个C++类,其中包含两个函数,例如:
class MyClass
{
bool Foo(int val);
bool Foo(string val);
}
可以像这样使用三元运算符吗?
MyClassInstance->Foo(booleanValue?24:"a string");
并根据 booleanValue
的值,调用不同的 MyClass
函数?
假设我有一个C++类,其中包含两个函数,例如:
class MyClass
{
bool Foo(int val);
bool Foo(string val);
}
可以像这样使用三元运算符吗?
MyClassInstance->Foo(booleanValue?24:"a string");
并根据 booleanValue
的值,调用不同的 MyClass
函数?
不能使用三元运算符。三元表达式的类型是其第二个和第三个操作数的公共类型;如果它们没有公共类型,则无法使用它。因此,请使用普通的if
语句:
if (booleanValue)
MyClassInstance->Foo(24);
else
MyClassInstance->Foo("a string");
三元条件表达式的类型是两个操作数都可转换的公共类型。正如您所建议的那样,您绝对不能执行“动态重载解析”。
由于int和char const *没有公共类型,因此代码甚至无法编译(当您测试时肯定已经注意到了这一点)。
(您可能会高兴地知道,正是由于这些语义和decltype在std::common_type特征类模板的实现中使用了三元条件运算符。)
(如果条件在静态上已知,例如sizeof(int)!=7,则可以使用模板专门化编写类似的代码,该代码执行条件重载解析,但当然是静态的。)
不可以这样做。
重载是在编译时进行的,所以它不能在运行时以这种方式工作。
通常情况下,您不会想要完全这样做,但是有时候使用iostream时可能希望执行以下操作:
os << ( condition ? var1 : var2 )
其中var1和var2具有不同的类型。但是这也不起作用。
您可以这样做:
MyClassInstance->Foo( booleanValue ? boost::any(24) : boost::any("a string") );
不行。为了进行重载决策,编译器会问“booleanValue?24:"a string"
的类型是什么?”这个问题无法回答。