我使用下面的
delimiter
操纵器在将项目写入字符串流时插入逗号或空格来分隔项目。有没有办法让它也支持多字符分隔符?
template <char C>
std::basic_ostream<char>& delimiter(std::basic_ostream<char>& os)
{
if (os.tellp())
os << C;
return os;
}
std::stringstream ss;
if (pid) ss << delimiter<','> << "pid=" << pid;
if (gid) ss << delimiter<','> << "gid=" << gid;
这里的上下文是构建一个用逗号分隔的统计信息的字符串,其中一些可能不可用(如 PID、GID 等)。我试图避免将逗号作为流中的第一个字符。而且
boost::join(list, ", ")
更麻烦,我更喜欢直接输出到流,而不是最后加入的临时列表。
您可以轻松
delim<char...>
;语法是 delim<',',' '>
,这很糟糕。
现代 C++ 具有用户定义的非类型模板参数。寻找编译时字符串实现。他们在自己内部存储一个数组,并使用类似
delim<auto>
和 delim<", "_cts>
。
一个比较简单的解决方案是编写一个连续传递样式的连接:
join(", ", foos, [&](auto&& x){os<<x;})
。这可以扩展为添加 operator<<
和 os<<join(", ", foos)
,将它们直接在回调中流式传输。
我们也可以在迭代时执行此操作:
if(!foo.empty())
os<<foo.front();
for(auto f:without_front(foo)){
os<<", "<<f;
}
使用量程适配器。