【发布时间】:2017-09-27 18:17:55
【问题描述】:
在 c++17/g++7 中,终于有了久违的 ostream_joiner。它可以正确输出到 ostream,用中缀分隔符分隔集合元素。
#include <algorithm>
#include <experimental/iterator>
#include <iostream>
#include <iterator>
#include <vector>
#include <string>
using string = std::string;
#if 1
struct pair {
string first;
string second;
};
#else
using pair = std::pair<string,string>;
#endif
std::ostream& operator<<(std::ostream& lhs, const pair &p) {
return lhs << p.first << "=" << p.second;
}
int main()
{
std::vector<pair> pairs = {{"foo", "bar"}, {"baz", "42"}};
std::copy(std::begin(pairs),
std::end(pairs),
std::experimental::make_ostream_joiner(std::cout, ", "));
}
虽然代码片段成功编译并输出...
foo=bar, baz=42
... 将 sn-p 中的 #if 1 更改为 #if 0 会使编译器抱怨缺少正确的移位运算符:
main.cpp:29:70: required from here
/usr/local/include/c++/7.2.0/experimental/iterator:88:10: error: no match for
'operator<<' (operand types are
'std::experimental::fundamentals_v2::ostream_joiner<const char*, char,
std::char_traits<char> >::ostream_type {aka std::basic_ostream<char>}' and
'const std::pair<std::__cxx11::basic_string<char>,
std::__cxx11::basic_string<char> >')
*_M_out << __value;
有人知道为什么吗?
更新
巴里给出了这个问题的正确答案。然而它并没有解决问题,并且运行手动循环并不是重用现有的stl代码,所以问题延伸到:
是否可以在不污染std命名空间的情况下让流算子工作?
【问题讨论】:
-
这个could be a soultion,但我不喜欢它,因为它涉及
std命名空间。
标签: c++ operator-overloading c++17