有时需要执行一次特定功能,然后切换到另一个实现。
例如,我对流输出迭代器感到非常恼火,它在与复制算法一起打印的项目之后打印定界符:
> 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 的自捕获? - 是否有另一种更具表现力(如 Python)的方式来执行这种
join
?
最佳答案
在这种情况下,您只需要:
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
.
关于c++ - lambda 函数捕获和修改自己的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44976627/