从D语言看C++ Template语法
许式伟 (版权声明)
2007-5-2
D语言是一门新兴的语言,它试图结合C/C++性能上的高效,同时又象Python、Ruby等“现代”语言那样具备高效的生产力。CSDN曾经对其做过专题报道。
我本人蛮喜欢D语言的语法,觉得当之无愧的简洁典雅。当然需要澄清的是,我不想让人误会,我不是要倡导“C/C++已死,请使用D语言”。本文也没有打算全面去讨论D语言。这里我只是把目光锁定在D语言的Template语法上。
我们先来看看C++中如何实现阶乘。
1)用函数实现阶乘:
intfactorial(intn)
{
if(n==0)return1;
elsereturnn * factorial(n-1);
}
voidtest()
{
printf(“4!=%d “,factorial(4));
}
2)用模板实现的阶乘:
template<intn>structfactorial
{
enum{ result=n*factorial<n-1>::result};
};
template<>structfactorial<0>
{
enum{result=1};
};
voidtest()
{
printf(“4!=%d “,factorial<4>::result);
}
再来看看D语言中的阶乘。普通函数我们就不写了,这里列出D语言支持的两套模板语法:
1)和C/C++类似的模板文法:
templatefactorial(intn)
{
constfactorial=n*factorial!(n-1);
}
templatefactorial(intn:0)
{
constfactorial=1;
}
voidtest()
{
writefln(factorial!(4));//prints24
}
2)D语言引入的新型模板文法:
templatefactorial(intn)
{
staticif(n==0)
constfactorial=1;
else
constfactorial=n*factorial!(n-1);
}
比较一下,我们不难理解,D语言对C++的模板文法主要做了以下2点改变:
1)将C++模板的<T>改为了!(T)。并将 factorial<n>::result 形式改为了 factorial!(n)。
2)引入了新的 staticif 文法。
引起我注意的是改变2)。很明显,D语言在试图让写模板的人思维方法可以象写普通的函数那样进行。这是一个很有意义的尝试。我们设想一下,如果C++ Template也来支持 staticif 文法:
template<intn>structfactorial
{
staticif(n==0)
enum{result=1};
else
enum{result=n*factorial<n-1>::result};
};
也许这会是一个不错的尝试。