27 votes

Une expression lambda peut-elle être passée comme pointeur de fonction ?

J'essaie de passer une expression lambda à une fonction qui prend un pointeur de fonction, est-ce possible ?

Voici un exemple de code, j'utilise 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;
}

25voto

Terry Mahaffey Points 7368

Dans la VC10 RTM, non - mais après la finalisation de la fonctionnalité lambda dans la VC10, le comité de normalisation a ajouté un langage qui permet aux lambdas apatrides de se dégrader en pointeurs de fonction. Cela sera donc possible à l'avenir.

13voto

FredOverflow Points 88201

Vous pouvez utiliser std::function pour ça :

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

Ou allez complètement générique :

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

4voto

user222202 Points 168

Cela fonctionne dans 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");
}

0voto

Crazy Eddie Points 23778

Non. C'est impossible. Pas de manière fiable, du moins. Je sais que VS2010 les implémente en tant que foncteurs d'objets. D'après la façon dont ils fonctionnent, cela peut être un a priori exigence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X