暴力双分派再论TList
来源:互联网 发布:struts2 json result 编辑:程序博客网 时间:2024/05/21 05:58
TypeList是Loki从外星引进的强大引擎, TypeList由模板支持构建,但是被构建出来的TypeList给了模板神奇的能力,Loki给予新知,源于模板,Loki给予震撼,源于TypeList。
其实TList很简单,但是它给我们带来的便利让我们如何赞扬它都不为过。
其实,在暴力双分派的对称处理中,我们只使用了TList::IndexOf工具,为了支持对称分派,我们在调用的时候做手脚:
template <bool swapArgs,class SomeLhs,class SomeRhs>
struct InvocationTraits
...{
static void DoDispatch(SomeLhs& lhs,SomeRhs& rhs,Executor& exec)
...{
exec.Fire(lhs,rhs);
}
};
template <class SomeLhs,class SomeRhs>
struct InvocationTraits<true,SomeLhs,SomeRhs>
...{
static void DoDispatch(SomeLhs& lhs,SomeRhs& rhs,Executor& exec)
...{
exec.Fire(rhs,lhs);
}
};
struct InvocationTraits
...{
static void DoDispatch(SomeLhs& lhs,SomeRhs& rhs,Executor& exec)
...{
exec.Fire(lhs,rhs);
}
};
template <class SomeLhs,class SomeRhs>
struct InvocationTraits<true,SomeLhs,SomeRhs>
...{
static void DoDispatch(SomeLhs& lhs,SomeRhs& rhs,Executor& exec)
...{
exec.Fire(rhs,lhs);
}
};
这非常简单,编译器的选择操作。神奇之处在于bool值的获得方法:
static void DispatchRhs(BaseLhs& lhs,BaseRhs& rhs,Executor exec)
...{
if (Head* p2 =dynamic_cast<Head*>(&rhs))
...{
enum ...{swapArgs = IndexOf<Head,RTList>::result < IndexOf<BaseLhs,LTList>::result};
InvocationTraits<swapArgs,BaseLhs,Head>::DoDispatch(lhs,*p2);
}
}
...{
if (Head* p2 =dynamic_cast<Head*>(&rhs))
...{
enum ...{swapArgs = IndexOf<Head,RTList>::result < IndexOf<BaseLhs,LTList>::result};
InvocationTraits<swapArgs,BaseLhs,Head>::DoDispatch(lhs,*p2);
}
}
Loki对这个操作有更精致的做法。
仅此一处对IndexOf的使用,就足以说明,对TypeList学习时间的付出是完全值得的。
- 暴力双分派再论TList
- 暴力双分派
- Tlist
- Tlist
- tlist -
- Tlist
- TList
- 运行阶段双分派
- 双分派模式
- 双分派的代码
- 实现C++双分派
- 分派
- 分派
- 访问者模式与双分派
- 访问者模式与双分派
- TList(1)
- TList类
- vim Tlist
- Microsoft .NET Pet Shop 4:将 ASP.NET 1.1 应用程序迁移到 2.0
- 索爱要倒向windows mobile??????
- 报个到!
- dll 动态调用(摘录)
- 在虚拟机环境下挂载USB设备到Linux
- 暴力双分派再论TList
- 傅立叶变换与图像处理
- 在虚拟机的Linux下连接ARM开发板
- 鼠标选择框特效。。。。
- 开发宝典:数据库设计技巧
- 关于free函数报错问题
- FC7添加更新源
- 搞笑图I
- 异常