Template + Type List导致C4002的问题

昨天,为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

你可能感兴趣的:(C++,c,F#,C#)