相关疑难解决方法(0)

在 C++ 中模拟 lambda 的复制赋值运算符

这个问题有两部分

首先,有人可以解释 C++ 禁用 lambda 的复制赋值运算符背后的基本原理吗?如果您要允许复制构造函数,为什么不使用复制赋值运算符?

其次,你如何最好地克服这个限制而不强迫人们编写 C++03 风格的函子,或者使用 std::function(我正在处理的函数很小,我希望编译器尽可能内联它们)?

背景:我正在尝试在我正在编写流处理库中实现类似 flat_map 的操作,类似于 Scala 或其他函数式语言中的 flatMap。因此,我需要创建一个迭代器来迭代迭代器列表。每次取消引用 flat_map 迭代器时,都会执行与内部迭代器关联的 lambda。每次内部迭代器到达末尾时,外部迭代器都需要切换内部迭代器。由于内部迭代器包含一个 lambda,因此没有复制赋值运算符,因此无法切换它。从技术上讲,我可以使用动态分配来解决问题,因此我总是调用复制构造函数,但这似乎不是正确的方法。下面是一段可能有助于突出问题的代码片段:

template <typename Iter>
class flat_map_iterator {
public:
  flat_map_iterator& operator++() {
    ++it_inner_;
    if (it_inner_ == (*it_outer_).end()) {
      ++it_outer_;
      // ERROR: cannot be assigned because its copy assignment operator is implicitly deleted
      it_inner_ = (*it_outer_).begin();
    }
    return *this;
  }
private:
  Iter it_outer_; 
  typename Iter::value_type::iterator it_inner_;
};
Run Code Online (Sandbox Code Playgroud)

编辑

感谢您的快速回复。这是一个用例示例:

 int res = ftl::range(1, 4).map([](int a){ …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

4
推荐指数
1
解决办法
1243
查看次数

标签 统计

c++ ×1

c++11 ×1

lambda ×1