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

Conditional operator with mixed data types?

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

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

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

error: incompatible operand types ('int' and 'const char *')

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

编译器:clang 3.5

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

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

例如

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

<< 运算符针对不同的数据类型进行了重载,并且在编译代码时,编译器会确定要调用的重载函数。这就是为什么您不能拥有 return 不同可能数据类型的函数:编译器无法以这种方式选择正确的重载。

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

如果你能更清楚地说明你到底想做什么,可能会更容易帮助你!

干杯

声明(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");