`
javatoyou
  • 浏览: 1030075 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

从D语言看C++ Template语法

阅读更多

从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};
};

也许这会是一个不错的尝试。

分享到:
评论

相关推荐

    参考 Muduo 网络库,使用 C++11 语法实现基于 Reactor 模式的高并发回显服务器。.zip

    C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...

    基于clang获取c++语法树生产代码.zip

    C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...

    C++标准模版库(Standard Template Library).pdf

    c++标准模板库c++标准模板库。

    这是一个gcc插件,它基于#pragma定义了一套C++序列化的语法,用以自动生成类似google-protobuf的代码。

    开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(Template)、异常...

    朱老师C++课程第3部分3.4.模板特化与类型萃取

    涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制...

    C++ 类模板和模板类的深入解析

    1、在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?  答:class用于定义类,在模板引入c++后,初定义模板的方法为:template,这里class关键字...

    基于LR(1)文法实现的类C语言语法分析器.zip

    C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...

    STL中常用的C++语法

    函数调用操作(c++语法中的左右小括号)可以被重载,STL的特殊版本都以仿函数形式呈现。如果对某个class进行operator()重载,它成为一个仿函数。 #include using namespace std; template struct Plus { T ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     ·使用visual c++ 2010支持的两种c++语言技术讲述c++编程的基础知识  ·分享c++程序的错误查找技术,并介绍通用的调试原则讨论每一个windows应用程序的结构和基本元素  ·举例说明如何使用mfc开发本地windows...

    FreeCL 2.03 皮肤版

    FreeCL采用C++语言,大量运用template语法,利用PME编程模式,模拟.Net等快速开发工具的编码风格,包含了常用的Windows标准控件、通用控件、Shell控件、IE风格菜单栏以及通用对话框,不需要开发者掌握繁复的Windows...

    FreeCL 2.02 皮肤版

    FreeCL采用C++语言,大量运用template语法,利用PME编程模式,模拟.Net等快速开发工具的编码风格,包含了常用的Windows标准控件、通用控件、Shell控件、IE风格菜单栏以及通用对话框,不需要开发者掌握繁复的Windows ...

    C++11返回类型后置语法的使用示例

    C++11新标准增加的auto不仅可以自动推断变量类型,还能结合decltype来表示函数的返回值。这些新特性可以让我们写出更简洁、更现代的代码。 在泛型编程中,可能需要通过参数的运算来得到返回值的类型。 我们看一下...

    McGraw C++程序调试实用手册

    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-app-template开发的一个基础后台框架.zip

    高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。...

    HTML Template C++-开源

    以PerlHTML :: Template建模的C ++模板类。 两个系统共享相同的语法。

    关于C++泛型编程的一些杂感

    其实GP这种东西最好是建立在无类型语言上面,就C++0X目前对GP的支持的趋势来看,确实如此,auto/varadictemplates这些特性的加入象征着C++GP的形式正越来越转向一种更纯粹的泛性语法描述,表面上你几乎不会看到任何...

    C++编程中使用设计模式中的policy策略模式的实例讲解

    在看《C++设计新思维》的时候,发现在一开始就大篇幅的介绍策略模式(policy),策略模式不属于经典设计模式中的一种,但是其实在我们日常的开发中是必不可少的。policy,策略,方针,这里的意思是指把复杂功能的类...

    C++面向对象程序设计——复习大纲.pdf

    这是由于 C++语言在函数调用时参数是自右至左入栈这一约定所决定的。 七、函数重载 函数重载:就是两个以上的函数,取相同的函数名,但是形参的个数和类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动...

    editplus 代码编辑器html c++ jsp css

    【14】工具集成——编译器集成例子(Java、Borland C++、Visual C++、Inno Setup、nsis、C#) 【15】工具集成——让Editplus调试PHP程序———————-avenger,aukw 【16】工具集成——打造 PHP 调试环境(二)——...

    C++ 关于STL中sort()对struct排序的方法

     一直没有系统去看过c++,因为懂得一些c的基本语法,在实际编程中用到c++,只能用到哪些看哪些,发现这样虽然能够完成大部分工作,但是有时候效率实在太低,比如说这节要讲的Std::sort()函数的使用,调了半天才调通...

Global site tag (gtag.js) - Google Analytics