首次进行C++的初始学习时,首先接触到的就是C++模板,在创建C++模板时出现了一些困难和难以理解的地方,比如向上类型转换,向下类型转换等相关麻烦,对于除类型之外,其余都相同的函数,我们一般有3种解决办法。
1、针对每个不同的类型重复地编写函数实体(C语言的做法):
- T const& f(T const& a, T const& b)
- {
- return a + b; //1处
- }
- int g = f(1,2);
2、使用Object(Java的做法)或者void*缺点有两个效率问题方面也有问题类型检查问题
3、使用宏预处理机制
缺点:只是愚蠢的文本替换,而且也不会考虑作用域和类型安全。然而,应用C++模板却可以避免这些缺点,我们可以编写:
优点:
代码简洁优雅,所有参数类型都以T来代替,真正实现了类型无关性。更好的类型安全性,所有的类型检查都是在编译期进行,而且避免使用指针。不存在继承,效率高。(1)没有虚函数;(2)所有的一切工作都是在编译期完成,大大提高运行效率。目的:告诉编译器如何做出最佳的选择,而且这种选择全部是在编译期完成的。C++模板的机制:特化 和 实参演绎
- // traits/accumtraits3.hpp
- template
- lass AccumulationTraits;
- c template<>
- class AccumulationTraits {
- public:
- typedef int AccT;
- static AccT const zero = 0;
- };
- template<>
- class AccumulationTraits {
- public:
- typedef int AccT;
- static AccT const zero = 0;
- };
- template<>
- class AccumulationTraits {
- public:
- typedef long AccT;
- static AccT const zero = 0;
- };
- (2)policy:通常表现为某个函数,指定的是一种行为
- class SumPolicy {
- public:
- template
- static void accumulate (T1& total, T2 const & value) {
- total += value;
- }
- };
- (3)trait和policy的用法:
- template >
- class Accum {
- public:
- typedef typename Traits::AccT AccT;
- static AccT accum (T const* beg, T const* end) {
- AccT total = Traits::zero();
- while (beg != end) {
- Policy::accumulate(total, *beg);
- ++beg;
- }
- return total;
- }
- };
优点:由:全局特化->局部特化->基本C++模板,这种特化顺序的选择与匹配(重载解析规则)是由编译器自动进行的,无需人工参与。可以根据不同的情况(诸如类型不同,条件不同),给出不同的实现,从而获得更加灵活的针对性。可以针对任何变化,改善了程序的扩展性。
实参演绎
第1部分介绍了模板的基本概念,以教程的风格来介绍这些基本概念。第2部分阐述了模板的语言细节,可以作为一本基于模板的构造的参考手册。第3部分介绍了C++模板所支持的基本设计技术,范围覆盖从微小的概念一直延伸到复杂的用法;一些技术在别的书籍都没有出现过。第4部分基于前两部分,深入讨论了各种使用C++模板的普通应用程序。
【编辑推荐】