缺少了C++模板真的不行吗

首次进行C++的初始学习时,首先接触到的就是C++模板,在创建C++模板时出现了一些困难和难以理解的地方,比如向上类型转换,向下类型转换等相关麻烦,对于除类型之外,其余都相同的函数,我们一般有3种解决办法。

1、针对每个不同的类型重复地编写函数实体(C语言的做法):

 
 
 
  1. T const& f(T const& a, T const& b)
  2. {
  3. return a + b; //1处
  4. }
  5. int g = f(1,2);

2、使用Object(Java的做法)或者void*缺点有两个效率问题方面也有问题类型检查问题

3、使用宏预处理机制

缺点:只是愚蠢的文本替换,而且也不会考虑作用域和类型安全。然而,应用C++模板却可以避免这些缺点,我们可以编写:

优点:

代码简洁优雅,所有参数类型都以T来代替,真正实现了类型无关性。更好的类型安全性,所有的类型检查都是在编译期进行,而且避免使用指针。不存在继承,效率高。(1)没有虚函数;(2)所有的一切工作都是在编译期完成,大大提高运行效率。目的:告诉编译器如何做出最佳的选择,而且这种选择全部是在编译期完成的。C++模板的机制:特化 和 实参演绎

 
 
 
  1.  // traits/accumtraits3.hpp
  2. template
  3. lass AccumulationTraits;
  4. c template<>
  5. class AccumulationTraits {
  6. public:
  7. typedef int AccT;
  8. static AccT const zero = 0;
  9. };
  10. template<>
  11. class AccumulationTraits {
  12. public:
  13. typedef int AccT;
  14. static AccT const zero = 0;
  15. };
  16. template<>
  17. class AccumulationTraits {
  18. public:
  19. typedef long AccT;
  20. static AccT const zero = 0;
  21. };
  22. (2)policy:通常表现为某个函数,指定的是一种行为
  23. class SumPolicy {
  24. public:
  25. template
  26. static void accumulate (T1& total, T2 const & value) {
  27. total += value;
  28. }
  29. };
  30. (3)trait和policy的用法:
  31. template >
  32. class Accum {
  33. public:
  34. typedef typename Traits::AccT AccT;
  35. static AccT accum (T const* beg, T const* end) {
  36. AccT total = Traits::zero();
  37. while (beg != end) {
  38. Policy::accumulate(total, *beg);
  39. ++beg;
  40. }
  41. return total;
  42. }
  43. };

优点:由:全局特化->局部特化->基本C++模板,这种特化顺序的选择与匹配(重载解析规则)是由编译器自动进行的,无需人工参与。可以根据不同的情况(诸如类型不同,条件不同),给出不同的实现,从而获得更加灵活的针对性。可以针对任何变化,改善了程序的扩展性。

实参演绎
第1部分介绍了模板的基本概念,以教程的风格来介绍这些基本概念。第2部分阐述了模板的语言细节,可以作为一本基于模板的构造的参考手册。第3部分介绍了C++模板所支持的基本设计技术,范围覆盖从微小的概念一直延伸到复杂的用法;一些技术在别的书籍都没有出现过。第4部分基于前两部分,深入讨论了各种使用C++模板的普通应用程序。

名称栏目:缺少了C++模板真的不行吗
网站网址:http://www.csdahua.cn/qtweb/news21/332721.html

成都网站优化推广公司_创新互联,为您提供小程序开发App设计虚拟主机微信公众号标签优化网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网