いくつかの外部のものの状態をチェックする特別なクラスを作成しました。何か変更があった場合、コールバック関数を呼び出したいと思います。 これらの関数は、特別なクラスの関数ではなくグローバル関数でなければなりません。私はここで何を意味するか表示するに はいくつかのコードです: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を見つけましたが、どのクラスを通過したのかを知る必要があります。私は、そこに関数ポインタのような何かがあり、まだ見つからなかったと思った。
誰かが解決策を知っていますか?
クロージャ、ラムダ式、 'std :: function'-sでC++ 11を使用することを検討してください。 C++ 17では、[std :: any](http://en.cppreference.com/w/cpp/utility/any) –