`
阿尔萨斯
  • 浏览: 4108996 次
社区版块
存档分类
最新评论

从D语言看C++ Template语法

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

从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)用模板实现的阶乘:

templateintn>structfactorial
{
enum{ result=n*factorialn-1>::result};
};

template
structfactorial>
{
enum{result=1};
};

voidtest()
{
printf(
4!=%d ,factorial4>::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)。</n></t>

2)引入了新的 staticif 文法。

引起我注意的是改变2)。很明显,D语言在试图让写模板的人思维方法可以象写普通的函数那样进行。这是一个很有意义的尝试。我们设想一下,如果C++ Template也来支持 staticif 文法:

templateintn>structfactorial
{
staticif(n==0)
enum{result=1};
else
enum{result=n*factorialn-1>::result};
};

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




分享到:
评论

相关推荐

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

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

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

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

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

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

    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字符...

    HTML Template C++-开源

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

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

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

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

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

    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()函数的使用,调了半天才调通...

    C++编程思想/模板和容器类

    包容器和循环子,模板的综述/语法,字符串和整型,向量,模板和继承,多态性和包容器,包容器类型,函数模板,控制实例

    程序员面试刷题的书哪个好-effective_cpp_notes:Effective_cpp_notes

    学习程序语言语法是一回事; 学习如何以某种语言设计并实现高效程序则是另一回事. 掌握一般性的设计策略和带有具体细节的特定语法特性是我的忠告. 同时我也比较赞同刘未鹏大神所说, , 你要问三个问题. 1 它的本质是...

    C++类模板与模板类深入详解

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

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    c++中typename和class的区别介绍

    在模板引入c++后,最初定义模板的方法为: template…… 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字。它的作用同class一样表明后面的...

    Cpp-Templates-2ed::books: C++ Templates 2ed 笔记:C++111417 模板技术

    该笔记精简并覆盖了原书所有知识点,纠正了书中几乎所有的错误代码,代码语法均通过 VS 2017 检验,仅有一处因语法复杂编译失败。个别词汇的理解偏差很容易导致误解整个知识点,该笔记在个人的反复理解上,还原了书...

Global site tag (gtag.js) - Google Analytics