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
{
}

编译时提示:

image 点开第一句,定位到:

image 这个错误提示是由代码提供的,而不是编译器。这段代码相当于扩展了编译器,牛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的不行不行的。

原文地址:https://www.cnblogs.com/wanhongnan/p/5727826.html