有时需要执行一次特定的功能,而不是切换到另一个实现。
例如,我对流输出迭代器非常恼火,它在打印项目与复制算法一起打印分隔符后:
> 1,2,3,4,
^---- this is what happens in that case
问题不在于很好地打印项目,而在于正确连接它们的更多信息。
例如,Python使用string.join
函数生成正确的结果:
','.join((1,2,3,4))
> 1,2,3,4
我还想避免if/else
语句,因为我们只需要在第一次执行后进行一次切换。所以我想出的是:
std::function<char const*()> get_delim;
get_delim = [&get_delim]()
{
get_delim = [](){ return ","; };
return "";
};
for(auto b : some_byte_range)
std::cout << get_delim() << b;
注意:b
在我的案例中只是一个字节,这就是为什么我没有使用auto const&
。
现在问题:
std::function<char const*()>
声明,并以某种方式声明get_delim
与auto
有效地涉及自我捕获lambda? join
?答案 0 :(得分:4)
在这种情况下,您只需要:
auto get_delim = [c=char(0)]() mutable {
char cur = c;
c = ',';
return cur;
};
甚至:
auto get_delim = [c=char(0)]() mutable { return std::exchange(c, ','); }
如果您愿意,可以使用""
和","
,应该很容易看到如何调整以满足您的需求。
就图书馆来说,有一个std::experimental::ostream_joiner
。