2010-06-07 32 views
28

Bir lambda ifadesini bir işlev işaretçisi alan bir işleve iletmeye çalışıyorum, bu mümkün mü? VC10 lambda özelliği kesinleşmiş sonra ancak, standart komitesi için vatansız lambdas verir dil eklemek vermedi -Bir lambda ifadesi, işlev işaretçisi olarak iletilebilir mi?

VC10 RTM
#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

Linux'ta gcc-4.5.1 ile derler ve çalışır (ancak hiçbir lambda içermeyen 4.4.3'te derleme yapmaz) – Cubbi

cevap

26

, no: Burada

VS2010 kullanıyorum, bazı örnek kod işaretçiyi işlevine düşürmek. Yani gelecekte bu mümkün olacaktır.

+0

Hangi bölümde olduğunu hatırlıyor musunuz? Bu ilginç. – rlbond

+3

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

+0

Durum bilgisi olmayan lambda, yerel değişkenleri değer veya referans olarak almayan bir lambayı mı kastediyorsunuz? – balki

0

Hayır. Yapamaz. En azından güvenilir değil. VS2010'un onları nesne çeviricileri olarak uyguladığını biliyorum. Nasıl çalıştıklarına bağlı olarak, a priori gereksinimi olabilir.

13

Bunun için std::function kullanabilirsiniz:

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

Veya tamamen genel gidin: Bu VS2010 çalışır

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

:

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

bu işe yaramaz gibi gözüküyor ... elde ettiğim çıktı merhaba _ – subzero

0

sürece lamda değil yaptığı gibi yakalama maddesini kullan (yani, üstündeki değişkenleri yakalamaz), bir işlev işaretçisi olarak kullanılabilir. VC derleyicisi, dahili olarak farklı çağrı kuralları ile anonim işlevler üretir, böylece sorun olmadan kullanılabilir.

İlgili konular