我有几个double
类型的点。我只想在它们不是0
时才在流中写它们。我还要说它是哪一个,像这样:
x1=" value "
y1=" value "
等等..
有没有办法像这样做:
<< ( (x1 != 0) ? ( "x1=\"" << x1 << '"' ) : ' ') )
<< ( (y1 != 0) ? ( "y1=\"" << y1 << '"' ) : ' ') )
或者我必须发表几个if
else
个陈述?
答案 0 :(得分:6)
代码无法正常工作。 ( "x1=\"" << x1 << '"' )
运算符的两个操作数必须求值为相同的数据类型。在您的示例中:
左操作数甚至不是有效代码。 double
之类的表达式无效,因为您无法将char
或const 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;
}