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