【问题标题】:Conditional operator with mixed data types?具有混合数据类型的条件运算符?
【发布时间】:2015-05-24 19:31:02
【问题描述】:

条件运算符不能处理混合数据类型,所以:

bool cond = true;
cout << (cond?1:2) << endl;
cout << (cond?"msg1":"msg2") << endl;
cout << (cond?1:"msg") << endl;

在最后一行,我收到以下错误消息:

错误:不兼容的操作数类型('int' 和 'const char *')

有没有办法在这样的语句中混合不同的类型,使用一行代码?我需要把它放在一个预处理器宏中。

编译器:clang 3.5

【问题讨论】:

  • 如果您使用的是静态语言,编译器仅支持变量获取一种类型,因此它们必须具有相同的类型。某些编译器可能会允许这种操作
  • @Pietro 如果你的意思是最后一条语句,那么你可以写 cond ? std::to_string( 1 ) : "味精"
  • @VladfromMoscow:很好。如果你把它作为答案,我会接受它。
  • “[...] 使用单行代码?我需要将它放在预处理器宏中。”对此有两个 cmets: 1. 呃,你为什么使用宏? 2. 你知道你可以在一个宏中做多行语句,不是吗?
  • 您对它做的唯一事情是把它喂给ostream&amp; &lt;&lt;吗?如果是这样,您可以键入擦除到ostream&amp; &lt;&lt;。

标签: c++ types iostream conditional-operator


【解决方案1】:

对于最后一条语句,您可以确定常见类型,如std::string。

例如

std::cout << ( cond ? std::to_string( 1 ) : "msg" ) << std::endl;

【讨论】:

    【解决方案2】:

    问题在于 ? : 运算符导致赋值操作,因此它只能将值分配给单个类型,并且在编译时无法确定应该使用哪种类型,因为代码分支就像使用 if 语句一样。想象一个在一种情况下返回字符串而在另一种情况下返回 int 的方法,这是不可能的。您可以做的是,您可以按照莫斯科的@Vlad 建议的方式来划分类型。

    【讨论】:

      【解决方案3】:

      因此,将 (cond ? result1 : result2) 视为一个只需要一种返回类型的函数,就像任何其他函数一样。

      如果你给出一个更清晰的例子来说明你正在尝试做什么,那么帮助你可能会更容易!

      干杯

      【讨论】:

        【解决方案4】:

        statement (cond?1:"msg") 在编译过程中会导致失败。

        让a = (cond?1:"msg") 编译器会将这个表达式翻译成类似于这个

        if cond then 
            a = 1
          else
           a ="msg"
        

        我们可以看到分配给a 的值类型从if 更改为else。 但是,如果您使用支持类型更改的动态语言,那么它将是有效的。

        所以你应该使用 cout&lt;&lt;(cond?std::to_string( 1 ):"msg");

        【讨论】:

          猜你喜欢
          • 2017-08-26
          • 2013-04-08
          • 1970-01-01
          • 1970-01-01
          • 2013-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多