主题:[原创]metaprogam用法一例
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的话,不但需要自己用笔来计算,而且没有可扩展性.
刚才看到某人问如何计算 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的话,不但需要自己用笔来计算,而且没有可扩展性.