許式偉 (訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。)
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: 訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。