从D语言看C++ Template语法

许式伟 (版权声明)
2007-5-2

D语言是一门新兴的语言,它试图结合C/C++性能上的高效,同时又象Python、Ruby等“现代”语言那样具备高效的生产力。CSDN曾经对其做过专题报道。

我本人蛮喜欢D语言的语法,觉得当之无愧的简洁典雅。当然需要澄清的是,我不想让人误会,我不是要倡导“C/C++已死,请使用D语言”。本文也没有打算全面去讨论D语言。这里我只是把目光锁定在D语言的Template语法上。

我们先来看看C++中如何实现阶乘。

1)用函数实现阶乘:

int factorial(int n)
{
   if (n == 0) return 1;
   else return n * factorial(n-1);
}

void test()
{
    printf(“4! = %d “, factorial(4));
}

2)用模板实现的阶乘:

template <int n> struct factorial
{
    enum { result = n * factorial<n-1>::result }; 
};
  
template <> struct factorial<0>
{
    enum { result = 1 };
};
  
void test()
{
    printf(“4! = %d “, factorial<4>::result);
}

再来看看D语言中的阶乘。普通函数我们就不写了,这里列出D语言支持的两套模板语法:

1)和C/C++类似的模板文法:

template factorial(int n)
{
  const factorial = n * factorial!(n-1);
}
 
template factorial(int n : 0)
{
  const factorial = 1;
}
 
void test()
{
  writefln(factorial!(4));  // prints 24 
}

2)D语言引入的新型模板文法:

template factorial(int n)
{
  static if (n == 0)
    const factorial = 1;
  else
    const factorial = n * factorial!(n-1);
}

比较一下,我们不难理解,D语言对C++的模板文法主要做了以下2点改变:

1)将C++模板的<T>改为了!(T)。并将 factorial<n>::result 形式改为了 factorial!(n)。

2)引入了新的 static if 文法。

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

template <int n> struct factorial
{
   static if (n == 0)
      enum { result = 1 };
   else
      enum { result = n * factorial<n-1>::result };
};

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

从D语言看C++ Template语法相关推荐

  1. django template语法

    django template为设计者和程序员提供了不同的用法 我先说下对设计者这块的把 它里面主要分为3个部分把 1是基本语法这块:和python的语法比较相似.也是if else for 等等.可 ...

  2. 阅读《惰者集》《用数学的语言看世界》感悟

    遵循历史顺序,回归基本原理,把握数学本质,创造新的价值--阅读<惰者集--数感与数学><用数学的语言看世界>感悟 作者:张劲松,1972年2月生,人民教育出版社中学数学室编审, ...

  3. R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等)、编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据)、应用自定函数

    R语言用户自定义函数的语法结构.编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等).编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据).应用自定函数 ...

  4. 编译原理课程作业-Cminus语言的词法及语法分析器实现

    Cminus Compiler 编译原理课程作业-Cminus语言的词法及语法分析器实现 设计思想 词法分析 使用确定有限态自动机(DFA)实现与Lex自动分析两种方式实现. 语法分析 使用递归下降方 ...

  5. 基于Python实现的类Pascal语言的词法分析和语法分析器

    类Pascal语言的语法分析器 功能 使用Python实现的类Pascal语言的词法分析和语法分析器. 语法分析实现的功能有: 利用文法推导式构造LR(1)分析表 使用LR(1)分析表对输入的Toke ...

  6. swift语言特性,swift语法介绍,swift使用技巧

    Swift语言特性.Swift语法介绍.Swift使用技巧 Swift是一种由苹果公司开发的编程语言,于2014年首次发布.它是一种现代.快速.安全的编程语言,用于iOS.macOS.watchOS和 ...

  7. 抽象语法树 c语言,一个简单的例子看懂抽象语法树的魔力

    在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示.它以树状的形式表现编程语言的语法结构,树上的每个 ...

  8. c语言与python的语法区别_来自python的C语言(基本语法),从,Python,看,基础,篇

    一个学过C/C++的咸鱼,最近学起了Python,不得不说,知识还是老知识,语法也简单多了,但就是容易搞混.大致总结一下Python与C的区别,以后别张冠李戴啦,嘻嘻. Part  1.输入与输出 输 ...

  9. 从一张搞笑图看JavaScript的语法和特性

    作者:KAAAsS's blog 来源:https://blog.kaaass.net/archives/929?hmsr=toutiao.io&utm_medium=toutiao.io&a ...

最新文章

  1. Java基于Quartz的定时任务调度服务(一)
  2. 用Eclipse的snippets功能实现代码重用
  3. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解...
  4. File-nodejs
  5. Codeforces Round #476 (Div. 2) A. Paper Airplanes
  6. 2019最全Python入门学习路线,绝对是最全
  7. pycharm 导入或复制项目后run按钮灰色问题(显示pycharm add configuration)
  8. Windows7下VS2008试用版到期的解决办法
  9. redis cluster以及master-slave在windows下环境搭建
  10. 服务器系统自带ftp,win10如何使用自带FTP服务器
  11. Uploadify 控件上传图片 + 预览
  12. 线性表的链式存储结构-----链表
  13. 大数据第三季--flume(day2)-徐培成-专题视频课程
  14. ubuntu18.04安装opencv记录
  15. KF与无迹卡尔曼滤波详解
  16. 蓝牙模块 HC08_两个STM32开发板无线通信
  17. 数字华容道java_从零开发HarmonyOS(鸿蒙)手机小游戏——数字华容道
  18. Ms Sql Server 2000 个人绿色版 5.62
  19. 主进程、子进程和守护进程
  20. 图文并茂:推荐算法架构——粗排

热门文章

  1. html5+css3笔记整理
  2. python入门基础三之流程控制
  3. 【CSS基础】box-shadow盒子阴影(重点)
  4. 计算机在随机抽样上的应用,数理统计学中随机抽样的应用研究
  5. 第十七天(续第十六天BPDU相关知识以及STP的配置)
  6. 微信小程序隐藏分享按钮
  7. 【SearchString Algorithm Training】谭爷剪花布条
  8. mac 锤子android助手,苹果电脑连安卓就靠它了 锤子Smartisan点评
  9. 大型企业中复杂数据库存储过程的修改方法:7步法教你高效完成任务
  10. PHP 实现301转向代码