Chinaunix
标题:
这段代码的原理是什么
[打印本页]
作者:
apple753357
时间:
2009-07-15 22:50
标题:
这段代码的原理是什么
#include <iostream>
template<int N>
struct sum {
enum {result = sum<N-1>::result + N };
};
template<>
struct sum<1> {
enum{result = 1};
};
int main (int argc, char *argv[]) {
std::cout << sum<10>::result << std::endl;
return 0;
}
作者:
OwnWaterloo
时间:
2009-07-16 00:50
标题:
回复 #1 apple753357 的帖子
编译器遇见:
std::cout << sum<10>::result << std::endl;
中的sum<10>,就会去实例化这个类模板。
由类模板定义:
enum {result = sum<N-1>::result + N };
sum<10> 又会实例化sum<9>
sum<9> 会继续实例化sum<8>
直到sum<2>
enum { result = sum<1>::result + 2 };
而sum<1>有偏特化版本:
template<>
struct sum<1> {
enum{result = 1};
};
递归终止,得到结果sum<10>::result = 55;
作者:
zpp71
时间:
2009-07-16 10:39
就是在编译阶段实现递归。
作者:
apple753357
时间:
2009-07-17 00:32
这种依赖编译期的c++代码编写方式有什么用吗?
作者:
baopbird2005
时间:
2009-07-17 07:56
学习
作者:
rollin7
时间:
2009-07-17 13:25
学习一下,还没这么用过
作者:
OwnWaterloo
时间:
2009-07-17 14:42
标题:
回复 #5 apple753357 的帖子
原帖由
apple753357
于 2009-7-17 00:32 发表
这种依赖编译期的c++代码编写方式有什么用吗?
这种用法有时候被称为模板元编程(template meta programming)。
利用编译器对模板实例化进行编程工作, 编程的结果本身就作为另一个程序。
例子嘛…… 比如一个题目, 解析完题意就是,输入n ( 1 <= n <= 10 ),输出 n!。
按照常规也可以运行时计算:
---- factorial.cpp ----
int factorial(int n) { ... }
int main(void) {
int n = 0;
scanf("%d",&n);
printf("%d\n",factorial(n));
}
要更快一点么, 显然就是做一个表, 直接查:
---- factorial.cpp ----
static const int factorials[] = {
// 这里怎么计算表?
};
int main(void) {
int n = 0;
scanf("%d",&n);
printf("%d\n",factorials[n] );
}
表的计算那里可以用计算器算出来, 然后填……
也可以由另外一个程序生成:
---- generating.cpp ----
int main(void) { for (int i=0,j=1;i<=10,++i,j*=i) printf(" %d,\n",j); }
generating.exe > 1.txt
然后复制到factorial.cpp中, factorial.cpp 再编译为程序。
而模板元编程可以直接在一个cpp中完成这个事情。
template<int n>
struct factorial { enum { value = factorial<n-1>::value * n }; };
template<>
struct factorial<0> { enum { value=1 }; };
static const int factorials[] = {
factorial<0>::value,
factorial<1>::value,
// ...
factorial<10>::value,
};
[
本帖最后由 OwnWaterloo 于 2009-7-17 14:45 编辑
]
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2