根據意見,您可以使用std::function
或與建議的here類似的結構。
它遵循的第二條建議的最小和工作示例:
class Dispatcher {
Dispatcher() { }
template<class C, void(C::*M)() = C::receive>
static void invoke(void *instance) {
(static_cast<C*>(instance)->*M)();
}
public:
template<class C, void(C::*M)() = &C::receive>
static Dispatcher create(C *instance) {
Dispatcher d;
d.fn = &invoke<C, M>;
d.instance = instance;
return d;
}
void operator()() {
(fn)(instance);
}
private:
using Fn = void(*)(void *);
Fn fn;
void *instance;
};
struct S {
void receive() { }
};
int main() {
S s;
Dispatcher d = Dispatcher::create(&s);
d();
};
注意,它必須符合你的要求(目前,有針對性的成員方法沒有返回值,並且不接受參數)相應的修改。
此外,它可以很容易地擴展爲存儲目標成員方法的數組,這就是您要查找的內容:只需存儲一對instance
s和invoke
函數的向量。
另外,您可以使用Dispatcher
函數的可變參數模板使其更加靈活。這樣,您就可以定義具有不同返回類型和參數列表的Dispatcher
。
EDIT
它遵循一個Dispatcher
接受多於一個的目標成員函數的一個例子。
如上所述,通過可變參數模板來擴展它仍然很容易。
#include <vector>
#include <utility>
class Dispatcher {
template<class C, void(C::*M)() = C::receive>
static void invoke(void *instance) {
(static_cast<C*>(instance)->*M)();
}
public:
template<class C, void(C::*M)() = &C::receive>
void bind(C *instance) {
auto pair = std::make_pair(&invoke<C, M>, instance);
targets.push_back(pair);
}
void operator()() {
for(auto pair: targets) {
(pair.first)(pair.second);
}
}
private:
using Fn = void(*)(void *);
std::vector<std::pair<Fn, void*>> targets;
};
struct S {
void receive() { }
};
struct T {
void receive() { }
};
int main() {
S s;
T t;
Dispatcher d;
d.bind(&s);
d.bind(&t);
d();
};
請注意,在上面的例子中,沒有保證提交的instance
指針仍然有效,一旦實際使用。您應該照顧綁定對象的生命週期,或者稍微修改示例以引入更安全的句柄。
看看[std :: function](http://en.cppreference.com/w/cpp/utility/functional/function)。 –
[This](http://blog.molecular-matters.com/2011/09/19/generic-type-safe-delegates-and-events-in-c/)也可以是一個好點,從中可以開始。 – skypjack