meta progamming(元编程) 是C++中非常有趣的一个功能 计算 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的话,不但需要自己用笔来计算,而且没有可扩展性. 还可以继续简化: 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; }

评论