2010-06-07 3 views
28

Я пытаюсь передать выражение лямбда функции, которая принимает указатель на функцию, это даже возможно?Может ли выражение лямбда быть передано как указатель функции?

Вот некоторые примеры кода, я использую 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; 
} 
+0

Компилирует и работает с gcc-4.5.1 на Linux (но не компилируется в 4.4.3, у которого нет lambdas) – Cubbi

ответ

26

В VC10 RTM, нет - но после того, как функция лямбда в VC10 была завершена, стандартный комитет сделал добавить язык, который позволяет лицам без лямбды на деградировать до указателей функций. Поэтому в будущем это будет возможно.

+0

Вы помните, в каком разделе? Это интересно. – rlbond

+3

@ rlbond: N3090/3092, §5.1.2/6 –

+0

Апатридом lambda, вы имеете в виду лямбду, которая не принимает локальные переменные ни по значению, ни по ссылке? – balki

0

№ Это не может. По крайней мере, не стоит. Я знаю, что VS2010 реализует их как объектные функторы. Основываясь на том, как они работают, это может быть требование a priori.

13

Вы можете использовать std::function для этого:

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

Или идти полностью универсален:

template <typename Fun> 
void fptrfunc(Fun fun, int j) 
{ 
    fun(j); 
} 
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"); 
} 
+0

это, похоже, не работает ... вывод, который я получаю, приветствует _ – subzero

0

Пока лямбда не (т. е. не захватывает переменные сверху), его можно использовать как указатель функции. Компилятор VC внутренне генерирует анонимные функции с различными соглашениями о вызовах, поэтому их можно использовать без проблем.

Смежные вопросы