三元运算符和函数签名

时间:2012-10-24 13:21:29

标签: c++ ternary-operator function-signature

假设我有一个带有两个函数的C ++类,比如

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

是否可以像这样使用三元运算符

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

并根据MyClass的值调用booleanValue的不同函数?

4 个答案:

答案 0 :(得分:22)

不是三元运算符。三元表达式的类型是其第二和第三操作数的常见类型;如果他们没有普通类型你就不能使用它。所以只需使用普通的if语句:

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

答案 1 :(得分:7)

三元条件表达式的类型是两个操作数都可转换的公共类型2。你肯定可以执行“动态重载决策”,正如你似乎在暗示的那样。

由于intchar 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") );