- 论坛徽章:
- 1
|
幻の上帝 发表于 2014-06-23 10:39
回复 43# windoze
只要放弃C++继承跟OOD出来的继承一一对应的想法实际上问题就没那么大了。
为什么这里需要排斥继承呢。继承当mixin用不是很自然的手法么。
当然,要说C++在这里能力不足倒是对的。
成员的话得要一些不太好看的小花招。
template<class T>
class TextBoxTraits
{
public:
using Event = decltype(Txxx);
using EventMemberGetterType = some_getter_type; // 比如Event()。
private:
EventMemberGetterType p;
public:
template<typename T>
TextBoxTraits(EventMemberPtrType f) : p(f)
{}
Event& GetEvent()
{
// return (static_cast<T&>(*this).*p)();
// 这里按 EventMemberGetterType 具体类型看着办。
}
};
class Container : TextBoxTraits<Container >
{
public:
//...
};
只有一个事件比较浪费,多了还算能用。
不过我不用这套。为了接口清楚我宁可自己抄一遍类似的声明。就算mixin也是protected然后手动显式using。
如果怕麻烦罗嗦,用宏节约实现成本。
话说这里为什么要保存 event_handler 的一个拷贝呢?
要么直接在 container 里边定义
- template< typename D >
- struct TextBox
- {
- void on_enter_pressed()
- {
- D& self = static_cast<D&>( *this );
- self.process_enter();
- }
- void process_enter()
- {
- std::cout << "I am default enter handler";
- }
- };
- struct my_text_box : TextBox<my_text_box>
- {
- void precess_enter()
- {
- std::cout << "ding?";
- }
- };
复制代码 要么直接保存一个 map ,需要定制的时候直接修改就行了
- std::map<event_as_key_type, handler_function_type> event_handler_associate_map;
- event_hadler_associate_map[convert_event_to_key( enter_pressed_event )] = [](){ std::cout << "ding"; };
复制代码 |
|