好吧,我被殴打了。 无论如何,我会发布这个。
编辑:好吧,读完Nim的答案后,我的确达到了OP所希望的确切语法。
#include #include struct with_separator { with_separator(std::string sep) : sep(std::move(sep)) {} std::string sep; }; struct separated_stream { separated_stream(std::ostream &stream, std::string sep) : _stream(stream), _sep(std::move(sep)), _first(true) {} template separated_stream &operator << (Rhs &&rhs) { if(_first) _first = false; else _stream << _sep; _stream << std::forward(rhs); return *this; } separated_stream &operator << (std::ostream &(*manip)(std::ostream&)) { manip(_stream); return *this; } private: std::ostream &_stream; std::string _sep; bool _first; }; separated_stream operator << (std::ostream &stream, with_separator wsep) { return separated_stream(stream, std::move(wsep.sep)); } int main() { std::cout << with_separator(", ") << 1 << 2 << 3 << std::endl; }
输出:
1, 2, 3
简单的答案是,但是,你可以推出自己的…
#include #include using namespace std; struct set_some_separator{ set_some_separator(const char* sep) : _sep(sep) { }; template set_some_separator& operator<
好的, cout的格式稍有不同,嘿嘿…
不完全一样的东西,但是:
#include #include #include int main() { std::array data = { 1, 2, 3 }; std::ostream_iterator out(std::cout, " "); std::copy(data.begin(), data.end(), out); std::cout << '\n'; return 0; }
简单的解决scheme,也许你可以调整使用<<
template void myout(T value) { std::cout << value << std::endl; } template void myout(First first, Rest ... rest) { std::cout << first << " "; myout(rest...); } myout('a',"Hello",1,2,3,22/7.0);
如何使用ostream_iterator
int main() { std::vector data {2,3,33,45}; std::copy(std::begin(data), std::end(data), std::ostream_iterator(std::cout, " ")); std::cout << "\n"; }
使用逗号运算符的C ++ 17倍expression式可以创build一个很好的一行代码:
[](auto &&...xs){ ((std::cout << xs << ',') , ...); }(2,3,33,45);
如果您只是在寻找一种方法来打印vector元素,并且元素的分隔符正确(并且末尾没有额外的分隔符),请尝试以下操作:
#include #include int main() { std::vector v{1, 2, 3}; auto it = v.begin(); if (it != v.end()) { std::cout << *it; ++it; } for (; it != v.end(); ++it) { std::cout << ", " << *it; } }