2013-10-22 4 views
5

Betrachten Sie den folgenden Code ein:C++ Lambda: Zugang statische Methode in Lambda führt ‚dies wurde nicht erfasst für diese Lambda-Funktion‘ auf Fehler

//this is what I want to call; I cannot modify its signature 
void some_library_method(void(*fp)(void)); 

class Singleton{ 
    public: 
     static Singleton *instance(); 
     void foo(); 
     void bar(); 
    private: 
     Singleton(); 
}; 

void Singleton::foo(){ 
    //this leads to an error ('this' was not captured for this lambda function) 
    void(*func_pointer)(void) = []{ 
     Singleton::instance()->bar(); 
    }; 
    some_library_method(func_pointer); 
} 

Ich möchte ich eine Funktion aufrufen, kann nicht geändert werden (some_library_method siehe oben) erwartet einen Funktionszeiger als Argument. Der Anruf sollte in einem Klassenmitglied foo() erfolgen. Ich weiß, dass ich dort nicht auf Klassenmitglieder zugreifen kann, aber ich möchte nur auf die Klasse Singleton auf statische Weise zugreifen (die Singleton-Instanz abrufen).

Gibt es eine Möglichkeit Reform der Lambda-Ausdruck, der das Ziel Compiler zu zeigen, g ++ v4.7.2, dass es wirklich tut nicht zu this eine Referenz benötigen?

Antwort

2

Die folgende Behelfslösung funktioniert:

template< typename T > T* global_instance() { return T::instance(); } 

void(*func_pointer)(void) = []{ 
    global_instance<Singleton>()->bar(); 
}; 
+0

groß verwenden können, danke – muffel

1

Sie eine lokal definierte reguläre Funktion anstelle eines Lambda für das

void Singleton::foo() { 
    struct T { 
     static void cb(){ Singleton::instance()->bar(); } 
    }; 
    some_library_method(T::cb); 
} 
+0

'T' scheint wie ein armes Namenswahl für diesen Typ. – Yakk

+0

interessante Lösung, danke! – muffel

+0

@Yakk: IMO 'LocalStructureNeededBecauseCppDoesntAllowLocalFunctions' wäre schlimmer gewesen :-) – 6502

Verwandte Themen