lambda表达式可以作为函数指针传递吗?

时间:2010-06-07 21:32:52

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

我试图将一个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;
}

5 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:14)

您可以使用std::function

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

或完全通用:

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

答案 2 :(得分:4)

这适用于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");
}

答案 3 :(得分:0)

没有。这不可以。至少不可靠。我知道VS2010将它们实现为对象仿函数。基于它们如何工作,这可能是先验要求。

答案 4 :(得分:0)

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