D语言超强的编译时检测技术,强类型技术

D语言引入了static if , static assert , template , is 等一些语句,使得D语言可以使用编译时执行逻辑处理,同时也能进行编译时测试,这使得编译器在编译时就可以对自定义的类,结构,参数进行动态检测,这样让定义的东西有了强类型功能,牛B之作。

import std.stdio;
import std.range;
int main(string[] argv)
{
    int[] a = [0,1,2];
    int[] b = [4,5,6];
    auto c = chain(a , b);
    c.put(new A());
    writeln("c len:",c.length);
    writeln("c :",c);
    readln();
    return 0;
}

class A
{
}

编译时提示:

点开第一句,定位到:

这个错误提示是由代码提供的,而不是编译器。这段代码相当于扩展了编译器,牛B吧。扩大了C++中的#if,#else宏处理方式。

让编译器更加智能。 一直在想C#中什么时候才会有编译检测技术(强类型技术),即在编译时发现问题,而不等到运行时,等到运行里是个糟糕的事情。 这比像C#中依赖于继承关系,和where条件的检测技术强大多了。

以前觉得C#中的where条件编译时检测技术很牛,现在才发现D语言的更牛。

刚开始在看《D语言程序设计》这本书时,看到static if语言,还只是以为仅仅是#if宏的替代产品,没想到它具有这么强大的威力。真是太不可思议了。下面来看个标准库中实现类型判断的函数是如何实现的:

编译时类型判断函数的实现

这是一个使用模板实现的编译时检测函数,检测条件有4个

template isInputRange(R)
{
    enum bool isInputRange = is(typeof(
    (inout int = 0)
    {
        R r = R.init;     // can define a range object
        if (r.empty) {}   // can test for empty
        r.popFront();     // can invoke popFront()
        auto h = r.front; // can get the front of the range
    }));
}

这个检测函数不仅可以在编译时进行条件检测,还可以在程序中使用,用于判断对象是否实现InputRange需要的函数,字段和属性,这就比C#中只依赖继承关系的is语句更加强大。

看了D语言几天,真是越来越喜欢D语言了,真是牛B的不行不行的。

时间: 2024-10-24 10:35:10

D语言超强的编译时检测技术,强类型技术的相关文章

C语言中的编译时分配内存

1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等: 2.堆区(heap) --由程序员分配释放: 3.全局区或静态区 --存放全局变量和静态变量:程序结束时由系统释放,分为全局初始化区和全局未初始化区: 4.字符常量区 --常量字符串放与此,程序结束时由系统释放: 5.程序代码区--存放函数体的二进制代码 例: //main.c int a=0; //全局初始化区 char *p1; //全局未初始化区 void main() { int b; //栈 char

c++ 编译时检测结构体大小的的宏定义写法

一种写法: template <bool> struct CompileAssert { }; #define COMPILE_ASSERT(expr, msg) \ typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] } //endof namespace 第二种写法: 1 #define CAT_TOKEN_1(t1,t2) t1##t2 2 #define CAT_TOKEN(t1,t2) CAT_TOKE

编译时,运行时解释

在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念.理解这几个概念可以更好地帮助你去了解一些基本的原理.下面是初学者晋级中级水平需要知道的一些问题. Q.下面的代码片段中,行A和行B所标识的代码有什么区别呢? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class ConstantFolding {     static final  int number1 = 5;     static final  int n

编译时、运行时、构建时(二)

泛型(又称类型检验):这个是发生在编译期的.编译器负责检查程序中类型的正确性,然后把使用了泛型的代码翻译或者重写成可以执行在当前JVM上的非泛型代码.这个技术被称为“类型擦除“.换句话来说,编译器会擦除所有在尖括号里的类型信息,来保证和版本1.4.0或者更早版本的JRE的兼容性. List<String> myList = new ArrayList<String>(10); 编译后成为了: List myList = new ArrayList(10); 异常(Exception

C语言文件的编译到执行的四个阶段

C语言文件的编译与执行的四个阶段并分别描述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程. 第一个阶段: 是预处理阶段,在正式的编译阶段之前进行.预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容.如#include指令就是一个预处理指令,它把头文件的内容添加到.cpp

浅谈.NET编译时注入(C#--&gt;IL)

原文:浅谈.NET编译时注入(C#-->IL) .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台.所以.NET语言的编译就分为了两部分,从语言到MSIL的编译(我喜欢称为预编译),和运行时的从MSIL到本地指令,即时编译(JIT).JIT编译分为经济编译器和普通编译器,在这里就不多说了,不是本文的重点.本文主要讨论下预编译过程中我们能做的改变编译情况,改变生成的IL,从编译前后看看微软C#3.0一些语法糖,PostSharp的静态注入

将Microsoft Ajax Minifier集成到VS2013对JS、CSS进行编译时压缩

在网站发布中,一般要将js,css文件压缩减少体积,以减少在HTTP请求中的流量.将Microsoft Ajax Minifier集成到VS2013中就可以对JS.CSS进行编译时压缩. VS2013的集成方法: Asp.net网站上的详细说明网址:http://www.asp.net/ajaxlibrary/AjaxMinQuickStart.ashx      Microsoft Ajax Minifier下载地址:http://ajaxmin.codeplex.com/ 下载安装后,按照如

Spring AOP 实现原理(一) 使用 AspectJ 的编译时增强进行 AOP

AOP(Aspect Orient Programming),也就是面向方面编程,作为面向对象编程的一种补充,专门用于处理系统中分布于各个模块(不同方法)中的 交叉关注点的问题,在 JavaEE 应用中,常常通过 AOP 来处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等.AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 Spring AOP 为代表.本文会从

现代 C++ 编译时 结构体字段反射

基于 C++ 14 原生语法,不到 100 行代码:让编译器帮你写 JSON 序列化/反序列化代码,告别体力劳动.?? 本文不讨论完整的 C++ 反射技术,只讨论结构体 (struct) 的字段 (field) 反射,及其在序列化/反序列化代码生成上的应用. 正文开始于 [sec|静态反射] 部分,其他部分都是铺垫..可以略读... 背景(TL;DR) 很多人喜欢把程序员称为 码农,程序员也经常嘲讽自己每天都在 搬砖.这时候,大家会想:能否构造出一些 更好的工具,代替我们做那些无意义的 体力劳动