【问题标题】:Can a lambda expression be passed as function pointer?可以将 lambda 表达式作为函数指针传递吗?
【发布时间】:2011-02-28 21:59:51
【问题描述】:

我正在尝试将一个 lambda 表达式传递给一个接受函数指针的函数,这可能吗?

这是一些示例代码,我使用的是 VS2010:

#include <iostream>
using namespace std;

void func(int i){cout << "I'V BEEN CALLED: " << i <<endl;}

void fptrfunc(void (*fptr)(int i), int j){fptr(j);}

int main(){
    fptrfunc(func,10); //this is ok
    fptrfunc([](int i){cout << "LAMBDA CALL " << i << endl; }, 20); //DOES NOT COMPILE
    return 0;
}

【问题讨论】:

  • 在 Linux 上使用 gcc-4.5.1 编译和运行(但在没有 lambdas 的 4.4.3 中不编译)

标签: c++ lambda c++11 function-pointers


【解决方案1】:

在 VC10 RTM 中,没有 - 但在 VC10 中的 lambda 功能最终确定后,标准委员会确实添加了允许无状态 lambda 降级为函数指针的语言。所以未来这将是可能的。

【讨论】:

  • 你还记得那个部分吗?这很有趣。
  • @rlbond: N3090/3092, §5.1.2/6
  • 无状态 lambda 是指不通过值或引用获取局部变量的 lambda?
  • 无状态 lambda 是一个不通过值或引用获取任何范围的任何变量的 lambda
【解决方案2】:

您可以为此使用std::function

void fptrfunc(std::function<void (int)> fun, int j)
{
    fun(j);
}

或者完全通用:

template <typename Fun>
void fptrfunc(Fun fun, int j)
{
    fun(j);
}

【讨论】:

    【解决方案3】:

    这适用于 VS2010:

    template<class FunctorT>
    void* getcodeptr(const FunctorT& f) {
      auto ptr = &FunctorT::operator();
      return *(void**)&ptr;
    } 
    
    void main() {
      auto hello = [](char* name){ printf("hello %s\n", name); };
      void(*pfn)(char*) = (void(*)(char*)) getcodeptr(hello);
      pfn("world");
    }
    

    【讨论】:

    • 这似乎不起作用...我得到的输出是 hello ��_�
    【解决方案4】:

    没有。这不可以。至少不可靠。我知道 VS2010 将它们实现为对象函子。根据他们的工作方式,这可能是一个先验要求。

    【讨论】:

      【解决方案5】:

      只要 lambda 不使用捕获子句(即不从其上方捕获变量),它就可以用作函数指针。 VC 编译器在内部生成具有不同调用约定的匿名函数,以便可以毫无问题地使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 2017-12-14
        • 1970-01-01
        • 2013-10-11
        相关资源
        最近更新 更多