假设我有一个带有两个函数的C ++类,比如
class MyClass
{
bool Foo(int val);
bool Foo(string val);
}
是否可以像这样使用三元运算符
MyClassInstance->Foo(booleanValue?24:"a string");
并根据MyClass
的值调用booleanValue
的不同函数?
答案 0 :(得分:22)
不是三元运算符。三元表达式的类型是其第二和第三操作数的常见类型;如果他们没有普通类型你就不能使用它。所以只需使用普通的if
语句:
if (booleanValue)
MyClassInstance->Foo(24);
else
MyClassInstance->Foo("a string");
答案 1 :(得分:7)
三元条件表达式的类型是两个操作数都可转换的公共类型2。你肯定可以不执行“动态重载决策”,正如你似乎在暗示的那样。
由于int
和char const *
没有通用类型,因此代码甚至无法编译(正如您在测试时所注意到的那样)。
(您可能会很高兴知道三元条件的使用正是因为std::common_type
特征类模板的实现中的那些语义以及decltype
。)
(如果条件已知静态,例如sizeof(int) != 7
,那么您可以使用模板专精来编写 执行条件重载的类似代码分辨率,但当然是静态的。)
答案 2 :(得分:5)
没有。要执行重载解析,编译器会询问“booleanValue?24:"a string"
的类型是什么?”。这个问题无法回答。
答案 3 :(得分:5)
不,这是不允许的。
重载是编译时的,所以它不能以这种方式在运行时工作。
在代码中你并不常见,但是有时候iostream需要做类似的事情:
os << ( condition ? var1 : var2 )
其中var1和var2有不同的类型。这也行不通。
你可以这样做:
MyClassInstance->Foo( booleanValue ? boost::any(24) : boost::any("a string") );