2013-10-22 10 views
5

次のコードを考えてみましょう:私は(上記some_library_methodを参照)を変更することはできません関数を呼び出すしたいC++ラムダ:ラムダでのアクセス静的メソッドは、「これは、このラムダ関数のために捕獲されていません」というエラーにつながる

//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); 
} 

を関数ポインタを引数として期待しています。コールは、クラスメンバfoo()で行う必要があります。クラスメンバーにはアクセスできないことは知っていますが、静的な方法でクラスシングルトンにアクセスするだけです(シングルトンインスタンスを取得する)。

ターゲットコンパイラg ++ v4.7.2を表示するためにラムダ式を改変する方法はありますか?thisへの参照が必要ですか?

答えて

2

次の回避策が機能:

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

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

偉大なため代わりにラムダのローカルに定義された正規の機能を使用することができ、T 'が悪いように思える ' – muffel

1

あなたはその

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

ありがとうそのタイプの名前の選択。 – Yakk

+0

興味深い解決策、ありがとう! – muffel

+0

@Yakk:IMO 'LocalStructureNeededBecauseCppDoesntAllowLocalFunctions'は悪化していました:-) – 6502

関連する問題