C ++ cout自动分隔符
我想知道是否有办法, std::cout
自动插入打印序列之间的一些预定义的值。
例如:
std::cout << 2 << 3 << 33 << 45 << std::endl;
输出
233345
我希望它输出
2 3 33 45
我知道,这很容易:
std::cout << 2 << " " << 3 << " " << 33 << " " << 45 << std::endl;
但是,我想知道是否有一种方法来自动化,如:
std::cout << set_some_separator(" ") << 2 << 3 << 33 << 45 << std::endl;
有人知道这样的事情是可能的吗?
好吧,我被殴打了。 无论如何,我会发布这个。
编辑:好吧,读完Nim的答案后,我的确达到了OP所希望的确切语法。
#include <iostream> #include <algorithm> 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 <class Rhs> separated_stream &operator << (Rhs &&rhs) { if(_first) _first = false; else _stream << _sep; _stream << std::forward<Rhs>(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 <iostream> #include <sstream> using namespace std; struct set_some_separator{ set_some_separator(const char* sep) : _sep(sep) { }; template <typename T> set_some_separator& operator<<(const T& v) { _str << v << _sep; return *this; } friend ostream& operator<<(ostream& os, const set_some_separator& s) { return os << s._str.str(); } const char* _sep; ostringstream _str; }; int main() { cout << (set_some_separator(" ") << 2 << 3 << 33 << 45) << endl; }
好的, cout
的格式稍有不同,嘿嘿…
不完全一样的东西,但是:
#include <array> #include <iostream> #include <iterator> int main() { std::array<int, 3> data = { 1, 2, 3 }; std::ostream_iterator<int> out(std::cout, " "); std::copy(data.begin(), data.end(), out); std::cout << '\n'; return 0; }
简单的解决scheme,也许你可以调整使用<<
template<typename T> void myout(T value) { std::cout << value << std::endl; } template<typename First, typename ... Rest> 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<int> 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 <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3}; auto it = v.begin(); if (it != v.end()) { std::cout << *it; ++it; } for (; it != v.end(); ++it) { std::cout << ", " << *it; } }