c++ 流操纵器,如果流不为空,则插入多字符分隔符

问题描述 投票:0回答:1

我使用下面的

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, ", ")
更麻烦,我更喜欢直接输出到流,而不是最后加入的临时列表。

c++ templates std
1个回答
0
投票

您可以轻松

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;
}

使用量程适配器。

© www.soinside.com 2019 - 2024. All rights reserved.