2016-06-13 5 views
1

私はキーボード入力を関数にマッピングしています。私はかなりの部分をしましたが、今は文字列を関数にバインドして、その文字列を参照するキーが押されたときに呼び出されるようにする必要があります。C++の異なるクラスのメソッドのマップ

テンプレート void BindStringToAction(std :: string key、T * obj、R(T :: * methodPointer)(float));

しかし、問題は引き続き使用するために保管しておくことです。これらのメソッドは基本クラスを持ち、すべて同じ入力(float)と戻り値の型(void)を持つことができますが、それらをマップに格納するにはClassNameが必要です。

本質的に問題は、文字列とメソッドポインタのマップをどのように格納するのかです。後者はどのクラスにも配置できます。

同じことを実行しますが、実装や同様の情報が見つかりません。私はstd :: functionを見つけましたが、それはまた、変化するクラス名にも依存しているので、マップを作ることはできません。

+0

Builderを作成してマップを作成し、ビルダーへの一連の命令として機能する 'pair 'のリストを保存することができます。それは十分でしょうか? – Beta

+0

C++には、「どのクラスへのメソッドポインタ」もありません。あなたが求めていることは不可能です。達成しようとしていることを達成するには、別の方法を見つけなければなりません。 XY問題。 –

+2

'std :: function f = [=](浮動小数値){obj-> methodPointer(val);} }; '。これを 'std :: map >' –

答えて

2

C++ 11では、lambdaを使用してコールバック関数/メソッドをラップすることができます。たとえば:

struct A { 
    void callback(float in) { 
     std::cout << "A : " << in << std::endl; 
    } 
}; 

struct B { 
    void callback(float in) { 
     std::cout << "B : " << in << std::endl; 
    } 
}; 

int main() { 
    A a; 
    B b; 
    std::map<std::string, std::function<void(float)>> callbacks; 
    callbacks["A"] = [&a](float in){a.callback(in);}; 
    callbacks["B"] = [&b](float in){b.callback(in);}; 

    callbacks["A"](3.14); 
    callbacks["B"](42.); 
} 

出力は次のとおりです。

A : 3.14 
B : 42 

あなたのコールバックが関数、メソッドまたはラムダであれば、それは問題ではありませんこの方法です。私はあなたがやっていることに似た何かのためにこのシステムを使用し、それはうまく動作します。

+0

に保存することができます。他の開発者がlambdaを使う必要がないように関数を変換することは可能ですか?何かのように: テンプレート<型名T、型名R> ボイドライト(Tの*のOBJ、R(T :: * methodPointer)(フロート)){ \tのstd ::関数 = [OBJ](フロート) {メソッドポインタ(入力); }; \ta(1); } –

+1

ラムダは使いやすくて、最近はかなり普及しているので、あなたとあなたが一緒に使っている開発者が使い慣れていることを強くお勧めします。彼らは非常に便利ですし、それらを使用してコードを簡素化する多くのケースを見つけるでしょう –

関連する問題