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

Conditional operator with mixed data types?

本文关键字:条件运算符 数据类型 混合      更新时间:2023-10-16

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

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

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

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

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

编译器:clang 3.5

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

例如

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

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

<运算符会针对不同的数据类型进行重载,编译代码时,编译器会确定要调用的重载函数。这就是为什么不能有一个返回不同可能数据类型的函数:编译器不能以这种方式选择正确的重载。

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

如果你给出一个更清楚的例子来说明你到底想做什么,那么帮助你可能会更容易!

干杯

语句(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");