- template <typename Handler>
- class AnyType // 只为保存handler及handler的类型.
- {
- public:
- AnyType(Handler handler) : Handler_(handler) {}
- ~AnyType() {}
- static void any_call(void* handler)
- {
- AnyType<Handler>* pCall = (AnyType<Handler>*)handler;
- pCall->Handler_(); // 调用handler, 调用实际函数.
- }
- Handler Handler_;
- };
- typedef void (*any_call_fun)(void *handler);
- class AnyCall
- {
- public:
- AnyCall()
- {
- }
- ~AnyCall()
- {
- for (std::vector<void*>::iterator i = any_.begin();
- i != any_.end(); i++)
- {
- delete *i;
- }
- }
- template <typename Handler>
- void AddFuns(Handler handler_)
- {
- // if (any_.size() > 0) {
- // any_.pop_back(); // 弹出上一个元素, 只保存一个.
- // }
- AnyType<Handler>* h = new AnyType<Handler>(handler_);
- call_.push_back(AnyType<Handler>::any_call);
- any_.push_back((void*)h);
- }
- void CallAll()
- {
- std::vector<void*>::iterator i = any_.begin();
- std::vector<any_call_fun>::iterator j = call_.begin();
- for (; i != any_.end() && j != call_.end(); i++, j++)
- {
- (*j)(*i);
- }
- }
- std::vector<void*> any_;
- std::vector<any_call_fun> call_;
- };
- void add(int x, int y)
- {
- printf("%d + %d = %d\\n", x, y, x + y);
- }
- void sub(int x, int y)
- {
- printf("%d - %d = %d\\n", x, y, x - y);
- }
- void adds(int x, int y, int z)
- {
- printf("%d + %d + %d = %d\\n", x, y, z, x + y + z);
- }
- void PrintInfo(const char* str)
- {
- printf("info: %s\\n", str);
- }
- int main()
- {
- AnyCall tb;
- tb.AddFuns(boost::bind(add, 1, 3));
- tb.AddFuns(boost::bind(PrintInfo, "hello"));
- tb.AddFuns(boost::bind(adds, 1, 3, 1));
- tb.AddFuns(boost::bind(sub, 1, 3));
- tb.CallAll();
- return 0;
- }
- 运行结果:
- 1 + 3 = 4
- info: hello
- 1 + 3 + 1 = 5
- 1 - 3 = -2
- 请按任意键继续. . .
- //该片段来自于http://www.codesnippet.cn/detail/05122012831.html
来源: http://www.codesnippet.cn/detail/05122012831.html