【疯狂模板元0】像写小说一样写一篇技术文章吧

时间:2022-04-15 17:02:21

最近有些沉迷于c++的模板元编程,为了学这种被称为黑魔法的编程技术,我还又去学了一下haskell这种神奇的语言。不得不感叹,函数式编程,真特么难。。。之前就听说过一个鄙视链,面向对象程序员鄙视面向过程程序员,函数式程序员鄙视面向对象程序员。当时并不了解函数式编程,也不懂为什么会出现这样的鄙视关系。现在我大概懂一些了。能够使用函数式编程的程序员能力大概都是要高于面向对象程序员的。我这么说可能有的人就不高兴了。可是我这么说也是有自己的考虑的。因为函数式编程的核心思想,更像是把各种问题抽象成数学问题,然后再用数学的方式解决各种问题。就好像“向右转,齐步走”,这样的指令谁都会说,但是要把这样的指令转化成数学的指令,又有多少人能很好的做到呢?像刚才的那个问题,在面向对象的编程中可以写一个类,然后写两个方法,再依次调用就可以,大多数程序员都会有着这样的思维方式,但是函数式编程的解决方法,大概不会存在一个类,大概会有一个转向的函数,一个前进的函数,在执行的时候,会有一个“转向前进”的高阶函数,接受一个或几个变量做参数,这里可能是右转,然后必定会返回一个结果,这里可能是一个坐标,也可能是其他什么的,比如又返回一个函数之类的。当然返回一个函数放到c++里简直就是个耸人听闻的说法。但是在函数式编程中这种情况十分常见。而事实上,在c++模板元编程中这种方式也是非常常见的。

那么像上面那个问题,一定会有很多面向对象程序员表示不服,说不过是多了一层封装,c++照样可以把两个函数封装到一起,这有什么特别的?我只能说区别在于思想。函数式编程的基本粒子是函数,一切皆是函数(java程序员的欢呼:一切皆对象)。这个思想说起来就复杂了,大概能写一本书,上到天文,下到地理,内容包含哲学,史学,经济学,理学等方方面面。当然以上都是我胡扯的。但是确实,如果要真正的来讲思想,那最终一定会上升到哲学的层面,我自身也不能很好的掌控这个东西。可能在经过更多的学习之后才能更好的去掌控这种东西,所以这里就不多废话了。函数式编程的思想,必定会在后面逐渐的交代,但是现在没有办法条条列列的例举出来。

那么闲扯了那么多函数式的东西,这有和我的标题有什么关系呢?对c++模板元有些了解的应该会知道,从编程泛型上来讲,模板元是属于函数式编程的。对于熟悉精通c++oop思想的各位来说,模板元就像一匹磕了摇头丸的野马一样难以驾驭,当然是正常的反应。毕竟编程泛型都不同,使用oop的思想去编写函数式的代码当然是吃力不讨好的。不过我倒觉得这对于使用c++的各位来说不是什么坏事,最次也可以在喝酒喝多的时候吹个牛逼,用c++可以写出函数式的代码,其他语言能吗?呵呵。

然后接下来我想说一下我的标题。恩。虽然我只是个无名小卒,但是我还是想开个坑,来一篇长篇的c++模板元的系列文章。主要目的是为了整理我自己的思路。能够把自己所想的东西用文字记录下来,可以说明自己所想的东西自己已经消化理解了,并且写出来的这一个过程,又是一次对思路的整理。同时在写出来的时候,有一些原本很模糊的东西,或者原本忽视掉的东西,可能为了能把他写出来,就要再一次去思考,在思考过程中可能就会发现新的事实,或者发现原来的思想是有错误的,这对于我来说又是一次提升。然后万一被别人看到了,并且能够启发到别人,还能有一点小小的成就感,岂不美哉。

然后在这一篇的最后,我觉得需要把一些基础的环境交代清楚。首先,对于模板的语法,我是不会去花笔墨交代的。并且连基础进阶的东西也不会去提。为什么这样做,因为模板元是c++中相当高级的语法分支,我相信有缘看到这篇文章的,绝对都已经是高手级别的人物了,这一类人不需要再花时间看一些基础的语法。而新手则应该去看一些更基础的东西。对于我自身,更不必说这些基础的语法。而且事实上,如果光是针对c++的模板来说,基础加进阶的内容也够写好长的了。本身模板就已经算c++里比较难的部分了,要像新手教程那样写清楚也是非常花时间的事情。第二,在这个“长篇小说”中,会用到一些c++11的特性,比如变长参数模板,还有lambda表达式之类的。想要试一试的编译器请务必使用vs2013以上版本,2012不行,2012不支持变长参数模板。顺便说这里提一句,我很看好lambda,这个东西可能将来会给c++带来巨大的变革。但是在c++11这个版本下,lambda明显还没有进化到它的最终形态。我期待着lambda模板的出现。到那个时候,函数式编程可能会带来一场暴风雨。第三,就是我这篇一直在讲的函数式编程。c++程序员对这个不了解的应该占大多数,而对函数式了解的程序员,同时使用c++的应该也不能算很多(总数应该不会很多。并且已经选择了函数式编程的语言的程序员,可能再回来使用c++的可能性也不是很大)。所以对于这样的一种编程泛型,我可能会在文章中多次提到。最后,我想说一个遗憾的事情。模板元虽然威力强大,但是可能能够实际应用到一线的东西,并没有想象中那么多那么好用。究其原因,还是因为模板元并不是设计功能,是意外功能。所有模板元代码的执行器,都是在c++代码的编译期。而c++应用的执行期,模板元代码都是不能发挥作用的,所以那些在一线开发应用的同学们可能很难体会到模板元的强大威力。但是模板元的代码有很多在库开发是的应用,这其实也是由于模板元代码是在编译期执行所带来的结构。因为事实上,库开发者开发出来的东西,其实就是代码本身,而库的目标使用对象,就是那些开发应用程序的开发者。这就和模板元代码执行时间吻合了。所以对于库开发者来说模板元的用处可能会更大一些。

对了,还要提一句的是,这片文章必定会参考很多前人的文章。有时可能能记得放一个备注是从哪抄来的,有时可能就忘了。万一有这样的情况,还请多多海涵。现房一个连接,我从这个博客里面学到了不少东西

http://blog.jobbole.com/83461/