C++ 将lambda传递给成员变量的构造函数

C++ 将lambda传递给成员变量的构造函数,c++,templates,constructor,C++,Templates,Constructor,考虑以下几类: template <class L> class A { public: A(L l) : _l(l) {} private: L _l; }; class B { public: B(int x) : _x(x), _a([this]() { return _x; }) {} private: int _x; A<???> _a; }; 模板 甲级{ 公众: A(L):_(L){} 私人: L_L; }; B类{ 公众: B(in

考虑以下几类:

template <class L>
class A {
public:
  A(L l) : _l(l) {}
private:
  L _l;
};

class B {
public:
  B(int x) : _x(x), _a([this]() { return _x; }) {}
private:
  int _x;
  A<???> _a;
};
模板
甲级{
公众:
A(L):_(L){}
私人:
L_L;
};
B类{
公众:
B(intx):x(x),a([this](){return}{ux;}){
私人:
int_x;
A_A,;
};

我不确定如何在
处指定类型
std::function
可以工作,但据我所知,这意味着虚拟函数调用(当然,这不一定是坏的,但如何正确地执行这一点很有趣)。

您可以使用大致等效的function对象,而不是lambda

template <class L>
class A {
public:
  A(L l) : _l(l) {}
private:
  L _l;
};

class B {
  struct GetX
  {
    int operator()() const { return _b->_x; }
    B * _b;
  };
public:
  B(int x) : _x(x), _a(GetX{ this }) {}
private:
  int _x;
  A<GetX> _a;
};
模板
甲级{
公众:
A(L):_(L){}
私人:
L_L;
};
B类{
结构GetX
{
int运算符()()常量{return _b->u x;}
B*_B;
};
公众:
B(intx):x(x),a(GetX{this}){
私人:
int_x;
A_A,;
};

您可以使用大致等效的函数对象,而不是lambda

template <class L>
class A {
public:
  A(L l) : _l(l) {}
private:
  L _l;
};

class B {
  struct GetX
  {
    int operator()() const { return _b->_x; }
    B * _b;
  };
public:
  B(int x) : _x(x), _a(GetX{ this }) {}
private:
  int _x;
  A<GetX> _a;
};
模板
甲级{
公众:
A(L):_(L){}
私人:
L_L;
};
B类{
结构GetX
{
int运算符()()常量{return _b->u x;}
B*_B;
};
公众:
B(intx):x(x),a(GetX{this}){
私人:
int_x;
A_A,;
};

我认为最好的方法是改变你的设计。我无法告诉你如何使用函数对象,因为你所拥有的是一个玩具示例(确实适合你的问题),而不是一个lambda。你可以使用一个命名类型的函数对象。@eeroika所以一些带有
operator()
的结构,它在其构造函数中引用了
B
?这看起来像是一个XY问题。这里的最终目标是什么?@vullumee是的,虽然要匹配lambda,你需要在构造函数中使用指针。我认为最好的方法是改变你的设计。我无法告诉你如何使用函数对象,因为你所拥有的是一个玩具示例(确实适合你的问题),而不是一个lambda。你可以使用一个命名类型的函数对象。@eeroika所以一些带有
operator()
的结构,它在其构造函数中引用了
B
?这看起来像是一个XY问题。这里的最终目标是什么?@vullumee是的,尽管要想与lambda比赛,你应该把一个指针指向构造函数。@vullumee是的,我想是的。无论哪种方式,您都必须小心复制和移动
B
s@vullumee是的,我想是的。无论哪种方式,您都必须小心复制和移动
B
s