从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};
};
也许这会是一个不错的尝试。
分享到:
相关推荐
C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...
C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...
c++标准模板库c++标准模板库。
开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(Template)、异常...
涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制...
1、在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 答:class用于定义类,在模板引入c++后,初定义模板的方法为:template,这里class关键字...
C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...
函数调用操作(c++语法中的左右小括号)可以被重载,STL的特殊版本都以仿函数形式呈现。如果对某个class进行operator()重载,它成为一个仿函数。 #include using namespace std; template struct Plus { T ...
·使用visual c++ 2010支持的两种c++语言技术讲述c++编程的基础知识 ·分享c++程序的错误查找技术,并介绍通用的调试原则讨论每一个windows应用程序的结构和基本元素 ·举例说明如何使用mfc开发本地windows...
FreeCL采用C++语言,大量运用template语法,利用PME编程模式,模拟.Net等快速开发工具的编码风格,包含了常用的Windows标准控件、通用控件、Shell控件、IE风格菜单栏以及通用对话框,不需要开发者掌握繁复的Windows...
FreeCL采用C++语言,大量运用template语法,利用PME编程模式,模拟.Net等快速开发工具的编码风格,包含了常用的Windows标准控件、通用控件、Shell控件、IE风格菜单栏以及通用对话框,不需要开发者掌握繁复的Windows ...
C++11新标准增加的auto不仅可以自动推断变量类型,还能结合decltype来表示函数的返回值。这些新特性可以让我们写出更简洁、更现代的代码。 在泛型编程中,可能需要通过参数的运算来得到返回值的类型。 我们看一下...
13. l 从标准C++转向STL语法的过程中出现的问题 13.1.l 用迭代器遍历容器 13.1.2 仔细研究迭代器 13.1.3 流迭代器 13.1.4 为什么使用end() 13.1.5 复制列表 13.1.6 列表中的列表 13.1.7 STL字符...
高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。...
以PerlHTML :: Template建模的C ++模板类。 两个系统共享相同的语法。
其实GP这种东西最好是建立在无类型语言上面,就C++0X目前对GP的支持的趋势来看,确实如此,auto/varadictemplates这些特性的加入象征着C++GP的形式正越来越转向一种更纯粹的泛性语法描述,表面上你几乎不会看到任何...
在看《C++设计新思维》的时候,发现在一开始就大篇幅的介绍策略模式(policy),策略模式不属于经典设计模式中的一种,但是其实在我们日常的开发中是必不可少的。policy,策略,方针,这里的意思是指把复杂功能的类...
这是由于 C++语言在函数调用时参数是自右至左入栈这一约定所决定的。 七、函数重载 函数重载:就是两个以上的函数,取相同的函数名,但是形参的个数和类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动...
【14】工具集成——编译器集成例子(Java、Borland C++、Visual C++、Inno Setup、nsis、C#) 【15】工具集成——让Editplus调试PHP程序———————-avenger,aukw 【16】工具集成——打造 PHP 调试环境(二)——...
一直没有系统去看过c++,因为懂得一些c的基本语法,在实际编程中用到c++,只能用到哪些看哪些,发现这样虽然能够完成大部分工作,但是有时候效率实在太低,比如说这节要讲的Std::sort()函数的使用,调了半天才调通...