具有混合数据类型的条件运算符?

时间:2015-03-21 12:21:12

标签: c++ types iostream conditional-operator

条件运算符不能使用混合数据类型,因此:

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

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

  

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

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

编译:clang 3.5

4 个答案:

答案 0 :(得分:2)

这个问题是什么? :运算符导致赋值操作,因此它只能将值赋值给单个类型,并且在编译时不可能确定应该使用哪种类型,因为代码分支就好像使用了if语句一样。想象一个方法,在一个案例中返回一个字符串,在另一个案例中返回一个int,这是不可能的。你可以做的就是从莫斯科建议的@Vlad中找出类型。

答案 1 :(得分:1)

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

例如

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

答案 2 :(得分:1)

&lt;&lt;对于不同的数据类型,运算符被重载,并且在编译代码时,编译器确定要调用的重载函数。这就是为什么你不能拥有一个返回不同可能数据类型的函数的原因:编译器无法通过这种方式选择正确的重载。

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

如果您更清楚地说明您正在尝试做什么,可能更容易帮助您!

干杯

答案 3 :(得分:1)

语句(cond?1:"msg")在编译期间它会导致失败。

a = (cond?1:"msg")   编译器会将此表达式翻译为类似于此

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

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

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