主题:[原创]metaprogam用法一例
bruceteen
[专家分:42660] 发布于 2005-09-09 16:11:00
meta progamming 是C++中非常有趣的一个功能,虽然很少人会主动的使用她,但她却是C++中不可缺少的功能,在stl,loki,boost中大量的使用到.
刚才看到某人问如何计算 1!+2!+3!+4!+ ...+n!, 如果用metaprogam完成则非常的有趣,代码如下:
template<size_t n>
struct factorial
{
enum{ val = n * factorial<n-1>::val };
};
template<>
struct factorial<1>
{
enum{ val = 1 };
};
#include <iostream>
using namespace std;
int main( void )
{
cout << factorial<1>::val
+ factorial<2>::val
+ factorial<3>::val
+ factorial<4>::val
+ factorial<5>::val << endl;
return 0;
}
它和普通的写法有什么区别呢?区别在于普通的写法其结果是在运行时计算的,而metaprogam写法其结果却是在编译时计算的,不会占用任何运行时间.
上面的代码其实就等同于
int main( viod )
{
cout << 153 << endl;
return 0;
}
但如果直接写153的话,不但需要自己用笔来计算,而且没有可扩展性.
回复列表 (共12个回复)
沙发
cvfdeng [专家分:190] 发布于 2005-09-09 16:51:00
大虾. meta progamming 翻译过来,应该叫是么?我从来没有听过,叫是么编程.但我知道这种技术的好处.可以很大的提高运算速度.
板凳
just4zzfer [专家分:1300] 发布于 2005-09-09 16:54:00
结构体中为什么要用枚举类型呢?
为什么没有看到val的定义呢?
感觉对模版的用法还是一知半解。
请指点一下
3 楼
bruceteen [专家分:42660] 发布于 2005-09-09 16:54:00
翻译为: 元编成
"元"就是 基本,基础 的意思.
4 楼
bruceteen [专家分:42660] 发布于 2005-09-09 16:56:00
to just4zzfer:
其实按照C++的标准,写成 static const size_t val = n * factorial<n-1>::val; 就容易理解多了.
不过因为VC++6.0对C++标准支持不好,所以只好写成enum,这也算是一个技巧吧.
5 楼
drizzlecrj1 [专家分:4230] 发布于 2005-09-09 18:23:00
编译的时间似乎长了点。
长见识了,今天,呵呵!
6 楼
bruceteen [专家分:42660] 发布于 2005-09-10 11:59:00
呵呵,还可以继续简化:
template<size_t n> struct factorial
{
enum{ val = n * factorial<n-1>::val };
};
template<> struct factorial<1>
{
enum{ val = 1 };
};
template<size_t n> struct factorial_acc
{
enum{ val = factorial<n>::val + factorial_acc<n-1>::val };
};
template<> struct factorial_acc<1>
{
enum{ val = factorial<1>::val };
};
#include <iostream>
using namespace std;
int main( void )
{
cout << factorial_acc<5>::val << endl;
return 0;
}
7 楼
tYeen [专家分:1520] 发布于 2005-09-12 16:46:00
这就是简单方法啊,呵呵,头一回啊,楼主,THANK YOU!
8 楼
wotur [专家分:1000] 发布于 2005-09-12 17:06:00
那看到一个程序怎么样判断它是不是属于 元编程
怎样来体现它得好处呢!
9 楼
hqs [专家分:170] 发布于 2006-03-02 21:24:00
楼主。你不觉得写那么多好累啊~~,再说有些变量的值你又怎么在编译的时候算?光是算常数写那么多代码是不是有点不划算啊?
10 楼
euc [专家分:4310] 发布于 2006-07-14 13:00:00
bruceteen大师能不能再讲讲元编程的实用的例子?就是说什么时候非常适合用元编程?
我来回复