【问题标题】:Call method inside lambda expression在 lambda 表达式中调用方法
【发布时间】:2012-07-01 17:12:19
【问题描述】:

我想在 lambda 表达式中调用我的类的方法:

void my_class::my_method(my_obj& obj)
{
}


void my_class::test_lambda()
{ 
   std::list<my_obj> my_list;

   std::for_each(my_list.begin(), my_list.end(), [](my_obj& obj)
   {
      // Here I want to call my_method:
      // my_method(obj);
   });
}

我该怎么办?

【问题讨论】:

  • 需要详细信息。 my_class 的另一个成员函数中的 for_each 代码在哪里? my_method 是静态函数还是非静态函数?如果它不是静态的并且for_each 不在 my_class 成员函数中,那么您希望在哪个实例上调用 my_method?有关系吗?
  • for_each 在 my_class 的另一个非静态成员函数中。为什么要投反对票?
  • 因为问题没有写清楚。

标签: c++ lambda c++11


【解决方案1】:

您需要显式或隐式捕获this

std::for_each(l.begin(), l.end(),
    [this](my_obj& o){ // or [=] or [&]
      my_method(o); // can be called as if the lambda was a member
    });

【讨论】:

  • 假设 lambda 是从 my_class 的成员函数中使用的。这个问题不够具体,无法判断是否是这种情况。
  • @bames:我认为是,lambda 中的注释表明它应该被称为my_method(o),但我可以看到你来自哪里。
  • @Xeo 您可以使用别名来避免使用 this 变量“污染”所有范围,如下所示:[self = this],然后在 lambda 中您需要显式引用 this 变量/ 您要访问的函数,例如:self-&gt;my_method(o);,我相信这是捕获this 的更安全的方法,因为您始终需要明确访问。
【解决方案2】:

你不能在没有对象的情况下调用非静态方法。

创建一个my_class 对象并在 lambda 中捕获对它的引用...

my_class x;

std::for_each(my_list.begin(), my_list.end(), [&x](my_obj& obj)
//                                            ^^^^
{
    // Here I want to call my_method:
    x.my_method(obj);
});

或者,如果您的意思是 lambda 在 my_class 的方法中,则捕获 this。 或者,如果它是静态方法,那么您可以在不捕获任何内容的情况下调用 my_class::my_method(obj),如下面的 bames53 所述。

【讨论】:

  • 如果它是静态方法,那么您可以在没有实例的情况下调用它:[](my_obj &amp;obj) { my_class::my_method(obj); }。这个问题不够具体,我们无法知道它是否是静态的。
猜你喜欢
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2011-10-02
相关资源
最近更新 更多