操作符重载和隐式转换的思考
2017-10-07 本文已影响6人
码农苍耳
从刚开始工作的时候,就有很多人批判C++的操作符重载和隐式转换,我也是一直坚持显式调用的,但是最近看了一些C++相关的库后,发现其实这两者并没有那么的恐怖,反而在某些方面是一颗近乎完美的银弹!
在iOS开发中有一个描述算法的NSPredicate
,关于这个类的使用方式,就相当的复杂。
在sql中,有些很复杂的判断逻辑,比如a > b AND a < 100
之类的,但是这些并没有严格的类型限制,如果a
是一个时间类型,那么< 100
这个条件可能就是一个无效或者未知行为。虽然可以在运行的时候发现这个问题,但却不能在编译期就发现这样的问题。而C++就能很好的解决上面的问题,有严格的类型判定,以及一些类型转换。
在Objc中,有太多的api都非常的啰嗦,虽然说好听点能够表意,但很多时候简单的事情都会让代码非常的复杂。比如:
[string stringByAppendingString:@"string"];
[a isEqualToString:b];
而我们默认的几种方式并不会产生任何认知上的歧义:
string + "";
a == b;
在现在很多的计算并不是在CPU中执行的,而是需要放到GPU中执行,比如机器学习、渲染图片。那么如何定义GPU中的运算方式呢?著名的OpenGL就定义了自己的一套GLSL语言,iOS的CIImage也定义了一套类似的语言。但是这些都有同样的问题,那就是运行期进行编译和执行,依然不能在编译器发现问题。那么如果要放到编译期就必然需要利用语言的特性了,最简单的一个向量运算如果不能重载操作符,那么描述一个最简单的运算vec2 = vec1 * 2 + 2
也将是灾难性的。
所以,在某些场合下,利用这样的特性是非常方便而且对代码的可读性也有提高。
iOS中就有部分库是利用这样的特性,比如realm
和wcdb
。
当然这里说的优势并不代表没有劣势,但是利用好这种特性也能给可读性带来更高的提升。