C COUT自动分离器
C++ cout auto separator
我想知道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的回答后,我的 do 实现了所希望的。
#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
的格式是略有不同的,嘿,ho ...
不是完全相同的事情,而是:
#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;
}
使用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";
}
a c 17倍表达式使用逗号操作员可以创建一个不错的单线:
[](auto &&...xs){ ((std::cout << xs << ',') , ...); }(2,3,33,45);
简单解决方案,也许您可以对其进行调整以使用<<
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);
如果您只是在寻找一种正确界定元素的矢量的方法(最后没有额外的定界符),请尝试以下操作:
#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;
}
}
相关文章:
- 在C++中将系统与ECS(实体组件系统)管理器分离
- 为什么这个 RAII cout 重定向器不起作用:
- 如何解析小数分离器为结肠的数字的字符串表示:
- OpenGL 计算着色器分离循环的速度更快
- cout 似乎在矢量迭代器C++中无法正常工作
- 使用cstring.format()中区域设置的小数分离器
- 如果STD :: COUT发表评论,则计时器需要更长的时间才能达到10.f秒
- OpenCV格式化程序类和Mat对象的cout产生链接器错误:体系结构x86_64的未定义符号:libopencv_co
- XCode 附加进程/分离进程(以编程方式分离调试器)
- 为什么我总是必须除以 49 才能得到二进制转换器 + cout 歧义的正确答案?
- C COUT自动分离器
- C/C++中的6502仿真器:如何将寻址模式代码与实际指令代码分离
- Xcode调试器未显示C++cout输出
- 为什么有必要在 OpenGL 上创建着色器后分离和删除着色器
- 我可以用cout而不是迭代器循环打印STL映射吗?
- 调试器分离时是否可以通知应用程序
- DFS访问器不遍历分离的顶点
- 调试器没有从Winpdb分离
- OpenGL在可分离着色器程序中改变不同的位置
- 如何为cout编写一个允许表达性语法的函数包装器