暴力双分派再论TList

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);
    }

}
;

这非常简单,编译器的选择操作。神奇之处在于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);
    }

}

Loki对这个操作有更精致的做法。

仅此一处对IndexOf的使用,就足以说明,对TypeList学习时间的付出是完全值得的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值