使用三元运算符写入流?在C ++中

时间:2016-06-24 21:56:19

标签: c++ stream ternary-operator

我有几个double类型的点。我只想在它们不是0时才在流中写它们。我还要说它是哪一个,像这样:

x1=" value "

y1=" value "等等..

有没有办法像这样做:

    << ( (x1 != 0) ?  ( "x1=\"" << x1 << '"' )  : ' ') )
    << ( (y1 != 0) ?  ( "y1=\"" << y1 << '"' )  : ' ') )

或者我必须发表几个if else个陈述?

4 个答案:

答案 0 :(得分:6)

代码无法正常工作。 ( "x1=\"" << x1 << '"' )运算符的两个操作数必须求值为相同的数据类型。在您的示例中:

  • 左操作数甚至不是有效代码。 double之类的表达式无效,因为您无法将charconst char[]流式传输到字符串文字(相当于std::ostream&)。但如果它是有效的代码,它将评估为<<,这是char运算符的标准输出类型。

  • 右操作数是?:

由于他们不匹配类型,因此您无法使用if。您将不得不使用if (x1 != 0) mystream << "x1=\"" << x1 << '"'; else mystream << ' '; if (y1 != 0) mystream << "y1=\"" << y1 << '"'; else mystream << ' '; 语句来分解代码:

{{1}}

答案 1 :(得分:3)

您不能将<<运算符用作未附加到左侧可流式处理对象的表达式的一部分,例如std::ostream

如果你有一组double变量,我可能会建议你考虑循环它们。这是“几个if-else陈述”的改进。将它们放在一个数组或其他可以迭代的对象中:即:

// Example using 10 elements
#define N 10
double nums[N];
// ... code
for (int i = 0; i < N; ++i) {
    if (nums[i] != 0) {
        cout << "nums[" << i << "]=\"" << nums[i] << "\"";
    }
}

为了帮助澄清这是为什么,考虑将每个<<分解为一个函数调用(基本上是在幕后发生的事情):

(((std::cout << "string1") << 10) << std::endl);

std::cout << "string1"解析为类似

的内容
ostream& operator<<(ostream& stream, const char* str) {
    // Ouptut the string
    return stream;
}

这允许使用连续<<运算符的“链接”效果,因为每个运算符调用解析为相同的ostream

答案 2 :(得分:1)

您可以调用一个使用lambda的流操纵器:

std::ostream&

注意:C ++ 14广义lambda捕获允许用auto&替换{{1}}。

答案 3 :(得分:0)

这里缩短了@DieterLücking方法的版本

你可以像这样使用lambda:

#include <iostream>

int main() 
{
    int a = 0;
    int b = 1;
    [](std::ostream& stream, int x)->std::ostream& { if(x) stream << "b=\"" << x << '"'; return stream;}(std::cout, a);
    [](std::ostream& stream, int x)->std::ostream& { if(x) stream << "b=\"" << x << '"'; return stream;}(std::cout, b) << std::endl;
}