六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 39|回复: 0

从D语言看C++ Template语法

[复制链接]

升级  16.15%

427

主题

427

主题

427

主题

探花

Rank: 6Rank: 6

积分
1323
 楼主| 发表于 2013-1-26 13:53:02 | 显示全部楼层 |阅读模式
从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};
};

也许这会是一个不错的尝试。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表