从D语言看C++ Template语法
从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语法相关推荐
- django template语法
django template为设计者和程序员提供了不同的用法 我先说下对设计者这块的把 它里面主要分为3个部分把 1是基本语法这块:和python的语法比较相似.也是if else for 等等.可 ...
- 阅读《惰者集》《用数学的语言看世界》感悟
遵循历史顺序,回归基本原理,把握数学本质,创造新的价值--阅读<惰者集--数感与数学><用数学的语言看世界>感悟 作者:张劲松,1972年2月生,人民教育出版社中学数学室编审, ...
- R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等)、编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据)、应用自定函数
R语言用户自定义函数的语法结构.编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等).编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据).应用自定函数 ...
- 编译原理课程作业-Cminus语言的词法及语法分析器实现
Cminus Compiler 编译原理课程作业-Cminus语言的词法及语法分析器实现 设计思想 词法分析 使用确定有限态自动机(DFA)实现与Lex自动分析两种方式实现. 语法分析 使用递归下降方 ...
- 基于Python实现的类Pascal语言的词法分析和语法分析器
类Pascal语言的语法分析器 功能 使用Python实现的类Pascal语言的词法分析和语法分析器. 语法分析实现的功能有: 利用文法推导式构造LR(1)分析表 使用LR(1)分析表对输入的Toke ...
- swift语言特性,swift语法介绍,swift使用技巧
Swift语言特性.Swift语法介绍.Swift使用技巧 Swift是一种由苹果公司开发的编程语言,于2014年首次发布.它是一种现代.快速.安全的编程语言,用于iOS.macOS.watchOS和 ...
- 抽象语法树 c语言,一个简单的例子看懂抽象语法树的魔力
在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示.它以树状的形式表现编程语言的语法结构,树上的每个 ...
- c语言与python的语法区别_来自python的C语言(基本语法),从,Python,看,基础,篇
一个学过C/C++的咸鱼,最近学起了Python,不得不说,知识还是老知识,语法也简单多了,但就是容易搞混.大致总结一下Python与C的区别,以后别张冠李戴啦,嘻嘻. Part 1.输入与输出 输 ...
- 从一张搞笑图看JavaScript的语法和特性
作者:KAAAsS's blog 来源:https://blog.kaaass.net/archives/929?hmsr=toutiao.io&utm_medium=toutiao.io&a ...
最新文章
- Java基于Quartz的定时任务调度服务(一)
- 用Eclipse的snippets功能实现代码重用
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解...
- File-nodejs
- Codeforces Round #476 (Div. 2) A. Paper Airplanes
- 2019最全Python入门学习路线,绝对是最全
- pycharm 导入或复制项目后run按钮灰色问题(显示pycharm add configuration)
- Windows7下VS2008试用版到期的解决办法
- redis cluster以及master-slave在windows下环境搭建
- 服务器系统自带ftp,win10如何使用自带FTP服务器
- Uploadify 控件上传图片 + 预览
- 线性表的链式存储结构-----链表
- 大数据第三季--flume(day2)-徐培成-专题视频课程
- ubuntu18.04安装opencv记录
- KF与无迹卡尔曼滤波详解
- 蓝牙模块 HC08_两个STM32开发板无线通信
- 数字华容道java_从零开发HarmonyOS(鸿蒙)手机小游戏——数字华容道
- Ms Sql Server 2000 个人绿色版 5.62
- 主进程、子进程和守护进程
- 图文并茂:推荐算法架构——粗排