【问题标题】:Ternary operator and function signature三元运算符和函数签名
【发布时间】:2012-10-14 13:08:32
【问题描述】:

假设我有一个包含两个函数的 C++ 类

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

能不能像这样使用三元运算符

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

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

【问题讨论】:

  • 你试过编译运行看看会发生什么吗?
  • 这甚至不能编译。编译器会抱怨三元运算符的不同类型。
  • 我不明白这里的赞成票。当然,这是一个有趣的实验,但如果 OP 只尝试过,这个问题很容易避免。 OP 根本没有提供任何研究信息。
  • 我来自 PHP 背景,我立即得到 3 票反对。该死的有些语言很顽固,不是吗?
  • @Default 我应该以不同的方式表达我的问题:我的代码无法编译,有没有办法让它编译,或者这种表示法是否被禁止?下次我会更小心的……

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    三元条件表达式的类型是两个操作数都可转换的通用类型二。您绝对可以按照您的建议执行“动态重载解决方案”。

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 无法回答在编译时(不是我的反对票 BTW - 只是提出一个小建议来改进答案)
      • @Paul 在 C++ 中,表达式仅在编译时具有类型。谈别的没有意义。
      • 是的,我知道,关键是可以想象您可以确定动态调用哪个函数,即在运行时,但对于 C++,您需要知道编译时的类型。
      【解决方案4】:

      不,这是不允许的。

      重载是编译时的,所以它不能在运行时那样工作。

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

      os << ( condition ? var1 : var2 )

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

      你可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        • 2014-05-17
        • 2018-04-03
        • 2012-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多