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的不行不行的。