三元运算符和函数签名

11

假设我有一个C++类,其中包含两个函数,例如:

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

可以像这样使用三元运算符吗?

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

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


6
你尝试编译并运行它以查看会发生什么了吗? - Dan F
这甚至无法编译。编译器会抱怨三元运算符的不同类型。 - Olaf Dietsche
4
我不理解这里的点赞。当然,这是一个有趣的实验,但如果发布者只是尝试了一下,这个问题本来可以很容易地避免。发布者没有提供任何研究信息。 - default
我来自于 PHP 的背景,结果我立刻就被踩了 3 个负分。有些语言真是太固执了,不是吗? - mauris
1
@默认情况下,我应该用不同的措辞来提问:我有一段无法编译的代码,是否有方法使其编译,或者这种表示方法是被禁止的?下次我会更加小心... - Yannick Blondeau
4个回答

25

不能使用三元运算符。三元表达式的类型是其第二个和第三个操作数的公共类型;如果它们没有公共类型,则无法使用它。因此,请使用普通的if语句:

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

7

三元条件表达式的类型是两个操作数都可转换的公共类型。正如您所建议的那样,您绝对不能执行“动态重载解析”。

由于int和char const *没有公共类型,因此代码甚至无法编译(当您测试时肯定已经注意到了这一点)。

(您可能会高兴地知道,正是由于这些语义和decltype在std::common_type特征类模板的实现中使用了三元条件运算符。)

(如果条件在静态上已知,例如sizeof(int)!=7,则可以使用模板专门化编写类似的代码,该代码执行条件重载解析,但当然是静态的。)


5

不可以这样做。

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

通常情况下,您不会想要完全这样做,但是有时候使用iostream时可能希望执行以下操作:

os << ( condition ? var1 : var2 )

其中var1和var2具有不同的类型。但是这也不起作用。

您可以这样做:

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

5

不行。为了进行重载决策,编译器会问“booleanValue?24:"a string"的类型是什么?”这个问题无法回答。


无法在编译时回答(顺便说一句,这不是我的投票 - 只是提出一个小建议来改进答案) - Paul R
@Paul 在C++中,表达式仅在编译时具有类型。谈论其他事情是没有意义的。 - R. Martinho Fernandes
是的,我知道,关键是你可以在运行时动态确定要调用哪个函数,但对于C++来说,你需要在编译时知道类型。 - Paul R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接