2017-07-07 16 views
0

いくつかの外部のものの状態をチェックする特別なクラスを作成しました。何か変更があった場合、コールバック関数を呼び出したいと思います。 これらの関数は、特別なクラスの関数ではなくグローバル関数でなければなりません。私はここで何を意味するか表示するに はいくつかのコードです:C++ - "unknown"クラスへのポインタ

void myClass::addCallbackFunction(unsigned int key, TheSpecialClass* obj, void (TheSpecialClass::*func)(unsigned int, bool)) { 
    if(!obj) { 
     return; 
    } 
    callbackFunction cbf; 
    cbf.object = obj; 
    cbf.func = func; 

    if(!(callbackFunctions.find(key) == callbackFunctions.end())) { 
     //Key allready exists. 
     callbackFunctions[key].push_back(cbf); 
    } else { 
     //Key does not exists at the moment. Just create it. 
     vector<callbackFunction> v; 
     v.push_back(cbf); 
     callbackFunctions.insert({key, v}); 
    } 
} 

void MyClass::callCallbackFunction(unsigned int key, bool newValue) { 
    vector<callbackFunction> cbfs; 
    //hasKey.. 
    if(!(callbackFunctions.find(key) == callbackFunctions.end())) { 
     cbfs = callbackFunctions[key]; 
    } 

    //calling every function which should be called on a state change. 
    for(vector<callbackFunction>::iterator it = cbfs.begin(); it != cbfs.end(); ++it) { 
     ((it->object)->*(it->func))(key, newValue); 
    } 
} 

//to show the struct and the used map 
struct callbackFunction { 
    TheSpecialClass* object; 
    void (TheSpecialClass::*func)(unsigned int, bool) ; 
}; 
map<unsigned int, vector<callbackFunction> > callbackFunctions; 

今は変量できるクラスへのポインタのいくつかの種類に「TheSpecialClass」にしたいです。私はvoid-Pointerを見つけましたが、どのクラスを通過したのかを知る必要があります。私は、そこに関数ポインタのような何かがあり、まだ見つからなかったと思った。

誰かが解決策を知っていますか?

+1

クロージャ、ラムダ式、 'std :: function'-sでC++ 11を使用することを検討してください。 C++ 17では、[std :: any](http://en.cppreference.com/w/cpp/utility/any) –

答えて

0

私は私の用途に合わせてboost :: signal2を使いました。 A tutorial for boost::signal2 is found here

信号は機能を呼び出すだけです。特別なオブジェクトの関数ではありません。ブーストを使用することで、回避策はあり::バインド()のように:

boost::bind(boost::mem_fn(&SpecialClass::memberFunctionOfTheClass), PointerToTheObjectOfSepcialClass, _1) 

_1は一つの引数を必要とする関数(参照)を作成プレースホルダです。さらに多くのプレースホルダを追加して、より多くの引数を使用することができます。

関連する問題