10

假设我有一个具有两个函数的 C++ 类,例如

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

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

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

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

4

4 回答 4

25

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

if (booleanValue)
    MyClassInstance->Foo(24);
else
    MyClassInstance->Foo("a string");
于 2012-10-24T13:23:41.907 回答
7

三元条件表达式的类型是两个操作数都可转换的常见类型二。正如您似乎暗示的那样,您绝对不能执行“动态重载解决方案”。

int由于and没有通用类型char const *,因此代码甚至无法编译(正如您在测试时肯定注意到的那样)。

(您可能会很高兴知道使用三元条件正是因为这些语义在std::common_typetrait 类模板的实现中,以及decltype.)

(如果条件是静态已知的,例如sizeof(int) != 7,那么您可以使用模板特化来编写看起来相似的代码来执行条件重载决议,但当然是静态的。)

于 2012-10-24T13:23:54.730 回答
5

不。要执行重载解析,编译器会询问“什么是类型booleanValue?24:"a string"?”。这个问题无法回答。

于 2012-10-24T13:23:03.140 回答
5

不,这是不允许的。

重载是编译时的,因此它不能以这种方式在运行时工作。

在您想要完全这样做的代码中并不常见,但是有时使用 iostream 时希望执行以下操作:

os << ( condition ? var1 : var2 )

其中 var1 和 var2 具有不同的类型。那也行不通。

你可以这样做:

MyClassInstance->Foo( booleanValue ? boost::any(24) : boost::any("a string") );
于 2012-10-24T13:23:55.000 回答