【问题标题】:Assigning a lambda to a function pointer when using member variables in the lambda在 lambda 中使用成员变量时将 lambda 分配给函数指针
【发布时间】:2018-01-17 12:17:42
【问题描述】:

我使用函数指针作为模板函数的参数,该模板函数将其用作函子。但是,如果我通过调用类的成员变量来定义 lambda,如下所示,如果我想将其分配给函数指针,编译器会报错。

如果函数指针使用成员变量,我如何将 lambda 赋值给函数指针?

注意:没有可用的用户定义转换运算符可以执行 此转换,否则无法调用运算符

  // works
  bool(*arm_check_fcn)(const int &) = [](const int &pt) {
    return pt.m_Part == 3;
  };

  // fails
  bool (*bgr_check_fcn)(const int &) = [this](const int &pt) {
    return _ModelData.GetBackground() == pt;
  };

【问题讨论】:

    标签: c++11 lambda


    【解决方案1】:

    是的,只有一个完全没有捕获的无状态 lambda 可以强制转换为函数指针。如果您需要捕获this(或其他任何内容),则需要更改目标函数原型,使其模板化:

    template<class F> int f(F &&f);
    

    或接受 std::function 而不是指针:

    int f(std::function<bool(int)> const &f);
    

    或任何其他函数对象包装器。

    (我已将参数类型从 std::function 的参数中的 const-ref 更改为 int,因为将 const 左值引用绑定到标量类型通常几乎没有意义。)

    【讨论】:

    • 可惜了,所以我用了一个经典的类函子:/
    • @dgrat 如何将仿函数分配给函数指针? lambda 或多或少是手动函子定义的语法糖。
    • 我的意思是,我决定不传递函数指针作为模板参数,而是传递函子。
    • @dgrat 我仍然会使用 lambda。它更简洁,恕我直言,它比函子更好地捕捉到了成为函数的意图。我认为它也更符合当前的编码约定。
    • @Jens 你所说的“函子”是什么意思?
    【解决方案2】:

    函数不包含任何数据,因此不需要存储,只需要指向函数所在地址的指针。由于函数指针只是指向函数,因此可以将不带存储参数的 lambda 转换为函数指针。

    如果 lambda object 是函数指针并存储数据,则数据必须存储在某个地方。而且函数指针不能指向数据和函数。为此,根本不可能将带有捕获数据的 lambda 函数转换为函数指针。

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多