漫谈:C++模板究竟是什么

        C++模板是个比较难学的东西,因为太抽象了,而模板本身确实就是对算法的抽象。

        但是模板其实也没那么难学——难学的是STL。

        STL不是语言的一部分,只是一个框架或者类库。STL通过极其高明的设计用一组基本概念构建出了一套庞大的算法体系,同时也是极其难懂的——大部分程序员仅限于使用其中的最基础的一小部分,比如vector、set、map和sort。

        学习模板没必要从STL开始,你只需要明白“模板就是用来替换类型的宏”就可以了。

        当然有人会说你这句话太不严谨了,模板比宏厉害多了——其实真没厉害多少,模板跟宏的主要区别就是宏只做文本替换,对了错了都不管,模板则严格限制为类型替换,绝不会发生多一个分号、少一个括号之类的问题。

        模板做了什么事?就是用给定的类型替换模板代码,作为隐含的源代码编译,然后跟普通代码一样链接,如此而已。(这里我们就顺便理解了为什么有人说模板会增加编译时间,确实如此,每种不同的参数都会生成一份独立的代码)

        STL里有很多精妙的“概念”,比如各种类型的迭代器。所谓“概念”,就是模板要用到的功能,我们自己写模板,不一定有STL那么精妙,比如下面这个例子:

template

int fun(int a)

{

        T t;

        return T.x+a;

}

        这是一个合法的模板函数,而且我根本没有在函数参数里面用模板,而是在函数体里面用的,特意给大家演示模板无定式,就是个类型替换宏。

        我这里的T是个什么“概念”呢?

  • 默认构造函数——不然“T t;”这一句无法编译
  • 成员变量x(类型不确定,未必是int)——不然“T.x”无法编译
  • 成员变量x必须支持operator +(int)——不然“T.x+a”无法编译
  • 上面这个操作符重载的返回值必须可以自动转换为int——不然“return”无法编译

        这个T的概念当然算不上精妙,不过如果你有一批符合这个标准的类,都可以用在这里啊,这就是模板的意义。

你可能感兴趣的:(设计,抱怨与漫谈,软件开发,c++,开发语言)