现在的位置: 首页 > 综合 > 正文

Template + Type List导致C4002的问题

2013年08月11日 ⁄ 综合 ⁄ 共 1483字 ⁄ 字号 评论关闭

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

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

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

 

/*! 
*/
class _NullTypeListNode
{
};

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

template< typename VAT1, typename VAT2 >
class TGCVertexAssignGroup
{
};

#define TGC_VERTEX_ASSIGN_GROUP1(T1) TGCVertexAssignGroup< _NullTypeListNode, T1 >
#define TGC_VERTEX_ASSIGN_GROUP2( T1,T2 ) TGCVertexAssignGroup< T1, T2 >
#define TGC_VERTEX_ASSIGN_GROUP3( T1,T2,T3 ) TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP2( T2,T3 ) >
#define TGC_VERTEX_ASSIGN_GROUP4( T1,T2,T3,T4 ) TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP3( T2,T3,T4 ) >
#define TGC_VERTEX_ASSIGN_GROUP5( T1,T2,T3,T4,T5 ) TGCVertexAssignGroup< T1, TGC_VERTEX_ASSIGN_GROUP4( T2,T3,T4,T5 ) >
#define TGC_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>

 

晕死!

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

于是就只能这么写了:

 

#define TGC_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

抱歉!评论已关闭.