Template + Type List导致C4002的问题

C++ Typelist在GC Policy的应用
本文介绍了在GC的Policy体系中使用C++ Typelist的过程及遇到的问题。作者通过对比U3的Policy体系,说明了GC Policy的设计理念,并详细记录了在实现过程中由于C++宏定义展开规则而产生的编译错误及其解决方法。

昨天,为GC的添加了类似于U3的Policy的东西。

我一直很不爽U3的Policy体系,添加一个渲染模块太困难了,同时要修改N个地方,任何一个地方不修改都会导致问题。

GC的Policy使用了Typelist,其中Vertex Assignment使用了如下的Template + Typelist

/*!
*/
class_NullTypeListNode
{
};

template< DWORD Semantic, int SemanticUsage, int index, int Format >
classTVertexAssignNode
{
};

template< typename VAT1, typename VAT2 >
classTGCVertexAssignGroup
{
};


#defineTGC_VERTEX_ASSIGN_GROUP1(T1)TGCVertexAssignGroup< _NullTypeListNode, T1 >
#defineTGC_VERTEX_ASSIGN_GROUP2( T1,T2 )TGCVertexAssignGroup< T1, T2 >
#defineTGC_VERTEX_ASSIGN_GROUP3( T1,T2,T3 )TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP2( T2,T3 ) >
#defineTGC_VERTEX_ASSIGN_GROUP4( T1,T2,T3,T4 )TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP3( T2,T3,T4 ) >
#defineTGC_VERTEX_ASSIGN_GROUP5( T1,T2,T3,T4,T5 )TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP4( T2,T3,T4,T5 ) >
#defineTGC_VERTEX_ASSIGN_GROUP6( T1,T2,T3,T4,T5,T6 )TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP5( T2,T3,T4,T5,T6 ) >

结果……按如下方式调用:

TGC_VERTEX_ASSIGN_GROUP1(TVertexAssignNode<Pos, Pos, 0 , XYZ32> )

居然编译不过!

看了看文档,发现C++对这种宏,展开的是:

+TGC_VERTEX_ASSIGN_GROUP1

+TVertexAssignNode<Pos

+Pos

+0

+XYZ32

而不是

+TGC_VERTEX_ASSIGN_GROUP1

+TVertexAssignNode<Pos,Pos,0 ,XYZ32>

晕死!

文档里说,<>[]都没有被特殊对待,并不会影响“,”的解析,只有“(”在解析里的优先级是高于“,”的。

于是就只能这么写了:

#defineTGC_VERTEX_ASSIGN_NODE(sem,usage,index,format)TVertexAssignNode<sem,usage,index,format>

TGC_VERTEX_ASSIGN_GROUP1(TGC_VERTEX_ASSIGN_NODE(Pos, Pos, 0 , XYZ32) )

倒塌……

不过回头来想想,C++这么做也算是可以理解的,可能有人就想用之下的宏呢:

#define FOO( c, a, b) C##a## b

这样的话要填写一个

FOO( template<F, O, O>)

解析为 template<FOO>

虽然没啥用……

:P

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值