特別值得注意的是,因爲C++的模板語言是在編譯器編譯的時候完成的,所以又稱爲靜態語言,通常的C++語言又稱爲動態語言或者運行時語言。正是因爲模板語言是在編譯期完成的,所以我們可以藉助於這種編譯期的計算實現代碼自動生成的目的,從而實現C++自動化編程。
編譯期
宏
typedef影射
static類型變量和函數
const 類型變量
=,:?,-運算符
enum
運行期
對象使用
函數調用
變量賦值
操作變量時&,+=,++,--等運算符。
所以,如果想實現模板元編程,必須要把握的是一定要在編譯期完成程序,而不是在程序的運行期,仔細區分運行期和編譯期是模板元編程的第一步。
#include <iostream>
//編譯期四則計算的示例代碼
template<size_t i,size_t j> struct Add { enum{value = i+j}; };
template<size_t i,size_t j> struct Sub { enum{value = i-j}; };
template<size_t i,size_t j> struct Mul { enum{value = i*j}; };
template<size_t i,size_t j> struct Div { enum{value = i/j}; };
int main()
{
std::cout << "4+2=" << Add<4,2>::value << std::endl;
std::cout << "4-2=" << Sub<4,2>::value << std::endl;
std::cout << "4*2=" << Mul<4,2>::value << std::endl;
std::cout << "4/2=" << Div<4,2>::value << std::endl;
//爲了證明上面的計算是在編譯期進行的,我們編寫下面的代碼測試
//將模板值作爲數組定義時使用的參數就可以證明是在編譯期執行的計算:)
int a[Add<4,2>::value];//這麼定義並沒有錯
int b[Sub<4,2>::value];//這麼定義並沒有錯
int c[Mul<4,2>::value];//這麼定義並沒有錯
int d[Div<4,2>::value];//這麼定義並沒有錯
std::cout << sizeof(a)/sizeof(int) << std::endl;
std::cout << sizeof(b)/sizeof(int) << std::endl;
std::cout << sizeof(c)/sizeof(int) << std::endl;
std::cout << sizeof(d)/sizeof(int) << std::endl;
return 0;
}
運行結果:
2 利用模板元實現遞歸和循環
#include <iostream>
using namespace std;
//求階乘
template<int N> struct power{
enum {value = N * power<N - 1>::value};//循環遞歸過程
};
template<> struct power<0>{
enum { value = 1} ; //0的階乘是1,也是循環的終止條件
};
//求和
template<unsigned int N>struct sum{
enum{value = N + sum< N - 1 >::value};
};
template<> struct sum<1>{
enum{value = 1};
};
void main(){
int a[power<2>::value];
cout<<sizeof(a) / sizeof(int)<<" ";
int b[sum<3>::value];
cout<<sizeof(b) / sizeof(int)<<" ";
}
運行結果:
參考文章:
http://blog.csdn.net/pandaxcl/article/details/665409
http://blog.csdn.net/ugg/article/details/2703326