zoukankan      html  css  js  c++  java
  • 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的不行不行的。

  • 相关阅读:
    php之工厂模式
    PHP 给GIF 缩略图实例代码
    WGS84 Mercator project转换的算法(C#)
    .net Enum用法
    Google Maps API编程资源大全
    结对作业
    使用Lightbox制作照片条
    使用css3中transition的页面切换
    使用css3中transition的页面切换(继续创新版)
    iframe中父窗口获取子窗口的元素
  • 原文地址:https://www.cnblogs.com/wanhongnan/p/5727826.html
Copyright © 2011-2022 走看看