lambda函数捕获并修改自己的引用

时间:2017-07-07 17:30:20

标签: c++ c++11 lambda c++14

有时需要执行一次特定的功能,而不是切换到另一个实现。

例如,我对流输出迭代器非常恼火,它在打印项目与复制算法一起打印分隔符后:

> 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_delimauto有效地涉及自我捕获lambda?
  • 是否有其他更具表现力(如Python)的方式来做这种join

1 个答案:

答案 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