2008年7月27日 星期日

A sample of template meta-programming

C++ template 的發展動機其實很簡單,就是要增進程式碼的重覆利用性以及讓我們得以建立型別安全的容器,研究後最後發現,C++ template 機制本身是一部完整的 Turing-complete,可以被用來計算任何可以計算的值,進而衍生出 meta-programming 的概念。簡單說來,meta-programming 就是寫程式來產生程式碼 (由compiler產生,稱為俱現化,instantiation),再編譯成機器碼,這樣的好處就是可以把一些計算提到編譯時期處理,提高程式的效率也提早發現錯誤。通常拿來當作學習 C++ meta-programming 的程式大概就是階乘的計算,傳統上計算階乘的方法不是迭代法就是遞迴法,但這兩種方法都是在程式的執行時期才計算,以下簡單地給了非 meta-programming 版本以及 meta-programming 的版本,欣賞在編譯時就將數值計算完畢的神奇,也給對 meta-programming 有興趣的程式員一個入門的動力:

傳統版:
unsigned int Factorial (unsigned int n)
{
if ( n<=1 ) return 1 ;
else return n*Factorial(n-1);
}


int main()
{
cout << Factorial (10) << endl ;
return 0 ;
}



meta-programming 版:
template<unsigned n>
struct Factorial
{
enum { value = n * Factorial<n-1>::value } ;
};


template<>
struct Factorial<0>
{
enum { value = 1 } ;
};


int main()
{
cout << Factorial<10>::value << endl ;
return 0 ;
}

沒有留言: