Can a lambda expression be passed as function pointer?

12,025

Solution 1

In VC10 RTM, no - but after the lambda feature in VC10 was finalized, the standard committee did add language which allows stateless lambdas to degrade to function pointers. So in the future this will be possible.

Solution 2

You can use std::function for this:

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

Or go completely generic:

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

Solution 3

This works in 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");
}
Share:
12,025
LoudNPossiblyWrong
Author by

LoudNPossiblyWrong

yet another coder.

Updated on June 20, 2022

Comments

  • LoudNPossiblyWrong
    LoudNPossiblyWrong about 2 years

    I am trying to pass a lambda expression to a function that takes a function pointer, is this even possible?

    Here is some sample code, I'm using 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;
    }