昨天,为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++中,我们有丰富的STL(Standard Template Library)库,其中包括了像`list`这样的数据结构,提供了高效且方便的链表操作。然而,在纯C环境中,我们通常需要自己实现这些高级数据结构和算法。本篇将详细讨论如何...
3. **STL(Standard Template Library)**:STL提供了容器(如vector、list)、算法和迭代器,大大简化了数据处理和内存管理。 4. **异常处理**:C++的异常处理机制可以帮助编写健壮的代码,处理运行时错误。 5. **...
It can traverse one TypeList or enum value , then call user's template function by suitable type/enum value. This feature converts runtime data into compile data to meet metaprogramming requirement ...
同时将 <script type="text/ecmascript">hxportal.loadThreadList({fid:2,target:'#sec4_1_c'}); 这个里面的 fid:2 改成你想打开页面默认显示的版块ID 这里的ID 最后修改来和上面第一条的那个ID一样,这样效果更佳 ...
- 允许模板接受另一个模板作为参数,例如`template <template <typename> class Container> void process(Container<T> &c);` - 这种情况下的`Container`是模板模板参数,可以接受如`std::vector`或`std::list`等...
struct TypeList {}; ``` #### 六、模板与泛型编程 模板是C++中实现泛型编程的基础。泛型编程的核心思想是在不知道具体类型的情况下编写代码,从而达到代码重用的目的。模板为C++提供了这一能力,使得我们可以...
list-style-type: none; font-size: 0; /* 父元素的字体大小设为0 */ } ul li { width: 160px; display: inline-block; vertical-align: top; /* 保证顶部对齐 */ font-size: 12px; /* 子元素恢复字体大小 *...
上面的代码中的逻辑表达式用括号括起来主要是因为里面有>符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号. Pythons are ...
1. **基础语法**:C++起源于C语言,因此保留了C语言的大部分语法特性,如变量声明、类型系统、运算符优先级等。同时,C++增加了类(class)的概念,这是面向对象编程的基础。 2. **面向对象编程(OOP)**:C++支持...
5. **STL(Standard Template Library)**: STL是C++标准库的一部分,包含容器(如vector、list、map等)、算法和迭代器,极大地提高了代码的效率和可读性。 6. **内存管理(Memory Management)**: C++提供了动态...
在C++编程语言中,模板(Template)是一个强大的特性,它允许我们编写泛型代码,实现数据类型的通用性。模板可以应用于类(Class Templates)和函数(Function Templates),使得我们能够编写一次代码,就能适用于多...
在C++中,使用 `extern "C"` 来声明函数或变量时,会告诉编译器这些函数或变量按照C语言的方式进行链接,而不是C++的名称修饰(name mangling)。这通常用于C++程序调用C库或在C++代码中包含C库头文件时。 #### ...
这是因为 EditPlus 的语法是设置文件采用的是绝对路径,而在你设置了语法文件之后,再把程序复制到其它目录,因而导致 EditPlus 无法找到该语法文件。 解决办法: 在主程序目录里,找到 Setting.ini 这是 EditPlus ...
这是因为 EditPlus 的语法是设置文件采用的是绝对路径,而在你设置了语法文件之后,再把程序复制到其它目录,因而导致 EditPlus 无法找到该语法文件。 解决办法: 在主程序目录里,找到 Setting.ini 这是 EditPlus ...
表达式的前缀(int*)就是传统C风格的强制类型转换说明(typecast),又可称为强制转换说明(cast)。强制转换说明告诉编译器把表达式转换成指定的类型。有些情况下强制转换是禁用的,例如不能把一个结构类型转换成其他...
因为Linux与Windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统中会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有...
- **Definition**: 程序中存在的导致不正确行为的问题。 **Build 编连(专指编译和连接)** - **Definition**: 将源代码转化为可执行程序的过程。 **Built-In 建、置** - **Definition**: 内置于编程语言或环境中...
设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...