發新話題

[分享] 從D語言看C++ Template語法

從D語言看C++ Template語法

許式偉 (訪客無法瀏覽此圖片或連結,請先 註冊登入會員 )
2007-5-2

訪客無法瀏覽此圖片或連結,請先 註冊登入會員 是一門新興的語言,它試圖結合C/C++性能上的高效,同時又像Python、Ruby等「現代」語言那樣具備高效的生產力。CSDN曾經對其做過專題報道。
我本人蠻喜歡D語言的語法,覺得當之無愧的簡潔典雅。當然需要澄清的是,我不想讓人誤會,我不是要倡導「C/C++已死,請使用D語言」。本文也沒有打算全面去討論D語言。這裡我只是把目光鎖定在D語言的Template語法上。
我們先來看看C++中如何實現階乘。
1)用函數實現階乘:

int factorial(int n)
{
   
if (n == 0) return 1;
   
else return n * factorial(n-1);
}

void test()
{
    printf(
4! = %d , factorial(4));
}

2)用模板實現的階乘:
template <int n> struct factorial
{
   
enum { result = n * factorial<n-1>::result };
};
  
template
<> struct factorial<0>
{
   
enum { result = 1 };
};
  
void test()
{
    printf(
4! = %d , factorial<4>::result);
}

再來看看D語言中的階乘。普通函數我們就不寫了,這裡列出D語言支持的兩套模板語法:
1)和C/C++類似的模板文法:
template factorial(int n)
{
  
const factorial = n * factorial!(n-1);
}

template factorial(
int n : 0)
{
  
const factorial = 1;
}

void test()
{
  writefln(factorial
!(4));  // prints 24 }
2)D語言引入的新型模板文法:
template factorial(int n)
{
  
static if (n == 0)
   
const factorial = 1;
  
else
   
const factorial = n * factorial!(n-1);
}

比較一下,我們不難理解,D語言對C++的模板文法主要做了以下2點改變:
1)將C++模板的<T>改為了!(T)。並將 factorial<n>::result 形式改為了 factorial!(n)。
2)引入了新的 static if 文法。
引起我注意的是改變2)。很明顯,D語言在試圖讓寫模板的人思維方法可以像寫普通的函數那樣進行。這是一個很有意義的嘗試。我們設想一下,如果C++ Template也來支持 static if 文法:
template <int n> struct factorial
{
   
static if (n == 0)
      
enum { result = 1 };
   
else
      
enum { result = n * factorial<n-1>::result };
};

也許這會是一個不錯的嘗試。


Trackback:  訪客無法瀏覽此圖片或連結,請先 註冊登入會員

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。