C ++ Lambda返回自身

时间:2018-09-04 20:44:36

标签: c++ lambda

我想编写一个返回自身的lambda,所以我可以当场多次调用它。但是,如果lambda是在成员函数中定义的,则好像在lambda this内部不是指lambda,而是指周围对象的this

这是一个例子:

#include <iostream>

int main(int argc, char* argv[]) {
  int a = 5;
  [&](int b) {
    std::cout << (a + b) << std::endl;
    return *this;
  }(4)(6);
}

有没有办法做可比的事情?

4 个答案:

答案 0 :(得分:8)

使用旧函子:

height: root.height + 0.0001

Demo

答案 1 :(得分:6)

您不能返回lambda本身,但可以返回其他参数:

#include <iostream>

int main() {
  int a = 5;    
  [&](int b) {
      auto impl = [&](int b){std::cout << (a + b) << std::endl;};
      impl(b);
      return impl;
  }(4)(6);
}

但是,这只能再调用一次。不知道是否有一些技巧可以从中获得更多...

答案 2 :(得分:3)

Ben Voigt建议使用Y组合器(这是对标准库BTW的一个很好的建议),但是您的问题比较简单。您可以引入一个小的模板函子,而不是lambda来调用:

template<typename T>
struct recallable_impl {
    template<typename... Args>
    recallable_impl& operator()(Args&&... args) {
        f(std::forward<Args>(args)...);
        return *this;
    }

    template<typename F>
    recallable_impl(F&& f)
      :  f{std::forward<F>(f)}
    {}
private:
    T f;
};

template<typename T>
decltype(auto) recallable(T&& f) {
    return recallable_impl<std::decay_t<T>>(std::forward<T>(f));
}

您的lambda甚至不需要显式返回任何内容:

int main() {
  int a = 5;  
  recallable([&](int b){std::cout << (a + b) << std::endl;})(4)(5)(6)(7)(8);
}

答案 3 :(得分:0)

如果您将lambda分配给预先定义的类型(不是自动类型),则可以调用该lambda,并且它会被捕获:

std::function<void(int)> f =[&f](int n)
{
    if (n>0) f(n-1);
    return;
};