细说C++委托和消息反馈模板(1)(4)
结论
我们关于桥式委托的讨论接近尾声了,大家也许已经发现了一个巨大的问题:上面的桥式委托无法给相应操作传递参数!!!是的,这是一个巨大的矛盾——你必须自己实现带一个参数的桥、自己实现带2个参数的桥……就像stl的functor一样,你无法做到参数通用处理,必须区分unary_functor、binary_functor……你不得不这么做:
- template<class P1>
- struct DelegationInterface { virtual void Run(P1 param) = 0; };
- template<class T, class P1>
- struct DelegationImpl : public DelegationInterface<P1> {
- ......
- }
- template<class P1>
- struct Signal {
- DelegationInterface<P1> *_PI;
- ......
- }
以上、你会发现自己写了太多桥了,当然了,你可以绕路来实现,比如用一个通用的打包参数来包装多个参数,用宏定义来处理各种情况,当然也可以用预处理来实现——我这里要说的,同情一下QT吧,不要整天抱怨他的signal/slot体系需要预处理是在扩展语言——设身处地地想一想,C++提供给我们的就这有这些了,一个小小的参数是我们这些signal/slot抹不去的伤痛。
幸运的是,在C++标准委员会不断的努力之下,这些情况开始有所改善。boost库之中的signal库可以直接支持可变参数的委托;同时,越来越多的元语言技术也引入了C++之中。虽然目前支持这些新特性的编译器还比较少,不过这已经是非常巨大的进步了,让我们期待吧!
- 上一篇:C++内存管理的探讨(1)
- 下一篇:解析C++和C的区别