c ++ 11从lambda访问“this”传递给构造函数

时间:2014-07-18 14:39:06

标签: c++ c++11 lambda

是否有一种优雅的方式来访问"这个"在传递给构造函数的lambda中?

这有效,但不优雅!

#include <iostream>
#include <functional>

class CbClass {
 public:
  CbClass(int x, std::function< void() > cb) : x_(x),cb_(cb) {}
  int x_;
  std::function< void() > cb_;
  void call() { if (cb_) cb_(); };
};

int main() {

  CbClass* p(nullptr);
  CbClass** pp(&p);
  CbClass cb( 13 , [pp] () { std::cout << (*pp)->x_ << std::endl; } );
  p = &cb;

  cb.call();

}

2 个答案:

答案 0 :(得分:3)

您可以将this传递给call函数中的lambda:

#include <iostream>
#include <functional>

class CbClass {
public:
    CbClass(int x, std::function< void( CbClass * ) > cb) : x_(x),cb_(cb) {}
    int x_;
    std::function< void( CbClass * ) > cb_;
    void call() { if (cb_) cb_( this ); };
};

int main() {
   CbClass cb( 13 , [] ( CbClass *p ) { std::cout << p->x_ << std::endl; } );
   cb.call();
}

答案 1 :(得分:2)

您无法访问this。您可以访问随机捕获的CbClass对象,调用者将其排列为正在构建的对象。你不需要操纵任何指针。

int main() {
  CbClass cb(13, [&cb]() { std::cout << cb.x_ << std::endl; });
  cb.call();
}