今天看到一篇关于模版元编程的文章,一开始没看懂是什么意思,于是自己记下来。
直接看代码:
int factorial(int n) { if (n == 0) return 1; return n * factorial(n - 1); } void foo() { int x = factorial(4); // == (4 * 3 * 2 * 1 * 1) == 24 int y = factorial(0); // == 0! == 1 }
这是C++中一个用递归算阶乘的例子。
我们再看下面的:
template <int N> struct Factorial { enum { value = N * Factorial<N - 1>::value }; }; template <> struct Factorial<0> { enum { value = 1 }; }; // Factorial<4>::value == 24 // Factorial<0>::value == 1 void foo() { int x = Factorial<4>::value; // == 24 int y = Factorial<0>::value; // == 1 }
这个就是用模版元来实现阶乘的例子。首先我看到 template<int N> 的时候就觉得奇怪,模板不都是template<class T>这样的么。template<class T>是可以传递类型,而template<int N>可以传递一个int的参数,真搞不懂这个跟普通函数传递有什么区别。
模板元编程的优缺点
- 编译期对运行期:因为模板的运算以及展开都是在编译期,这会花相对较长的编译时间,但能够获得更有效率的运行码。这项编译期花费一般都很小,但对于大项目或是普遍依赖模板的程序,也许会造成很大的编译开销。
- 泛型程序设计::模板元编程允许程序员专注在架构上并委托编译器产生任何客户码要求的实现。因此,模板元编程可达成真正的泛用代码,促使代码缩小并较好维护。
- 可读性::对于C++来说,模板元编程的语法及语言特性比起传统的C++编程,较难以令人理解。因此对于那些在模板元编程经验不丰富的程序员来说,程序可能会变的难以维护。(这要视各语言对于模板元编程语法的实现)
- 移植性::对于C++来说,由于各编译器的差异,大量依赖模板元编程(特别是最新形式的)的代码可能会有移植性的问题。
模版元编程
时间: 2024-10-13 02:41:08