c++ - lambda 函数捕获和修改自己的引用

标签 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

最佳答案

在这种情况下,您只需要:

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/

相关文章:

c++ - 将 lambda 分配给 std::function

c++ - C++ 11 mersenne_twister_engine 类的问题

python - Pandas 数据框根据多列的输入应用 lambda

java - 在java中使用lambda内部增量

java - 我可以通过 Java 在 Selenium 中使用没有 ExpectedCondition 的 WebDriverWait 吗?

c++ - 如何为 Qt 应用程序重新校准触摸事件?

c++ - 包含和使用声明

c++ - 正确使用 std::condition_variable 来触发定时执行

c++ - 在 C++ 命名空间中, `static` 限定符在为 header 中声明的非成员子例程添加前缀时有任何影响吗?

c++ - QFile 不会打开文件