STL运用的C++技术(3)——模板实参推断

转载 2016年05月31日 10:58:49

 STL是C++标准库的重要组成部分之一,它不仅是一个可复用的组件库,更是一个包含算法与数据结构的软件框架,同时也是C++泛型编程的很好例子。STL中运用了许多C++的高级技术。本文介绍模板实参推断的运用。主要参考了《C++ Primer》和《STL源码剖析》。

       STL利用模板模板实现的,比如它的算法都是一个个的函数模板。我们知道模板是一个公式或是蓝图,本身不是类或是函数,需进行实例化的过程。这个过程是在编译期完成的,编译器根据传递的实参,推断出形参的类型,从而实例化相应的函数。《C++ Primer》中的定义:从函数实参确定模板实参的类型和值的过程叫做模板实参推断(template argument deduction)。下面给出STL中的几个算法,名字上做了简单的修改,略去了部分代码。

  1. //较小值  
  2. template <class T>  
  3. inline const T& Min(const T& a, const T& b) {  
  4.   return b < a ? b : a;  
  5. }  
  6. //较大值  
  7. template <class T>  
  8. inline const T& Max(const T& a, const T& b) {  
  9.   return  a < b ? b : a;  
  10. }  
           以下使用时,编译器就会根据实参实例化Min的两个版本。
  1. int main()  
  2. {  
  3.     cout<<Min(1,2)<<endl;  
  4.     cout<<Min(1.2,3.2)<<endl;  
  5.     return 0;  
  6. }  
  1. inline const int& Min(const int& a, const int& b) {  
  2.   return b < a ? b : a;  
  3. }  
  4. inline const double& Min(const double& a, const double& b) {  
  5.   return b < a ? b : a;  
  6. }  

        上面介绍的比较简单,具体的内容可以详见《C++ Primer》,本文只不过借此做个铺垫。上一篇文章“STL运用的C++技术(2)”,在获取迭代器所指的数据类型时,没有使用模板实参推断机制,而是使用了内嵌型别技术和模板特化技术。原因是它无法推断返回值的类型。这里再次把这段代码贴上来。

  1. //真正的交换函数    
  2. template <class Iter1, class Iter2, class T>    
  3. inline void _iter_swap(Iter1 a, Iter2 b, T) {    
  4.   T tmp = *a;    
  5.   *a = *b;    
  6.   *b = tmp;    
  7. }    
  8. //交换两个迭代器所指的元素    
  9. template <class Iter1, class Iter2>    
  10. inline void iter_swap(Iter1 a, Iter2 b) {    
  11.  _iter_swap(a, b, *a); //模板实参推断    
  12. }   

         iter_swap 函数利用模板实参推断来获取迭代器所指的数据类型。但是如果希望该函数返回第一个迭代器的数据时,该怎么办呢?模板实参推断是无能为力了,可以利用内嵌型别,如下定义即可。注意必须加关键字typename,用于告诉编译器这是个型别,否则编译无法通过。

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <list>  
  4. using namespace std;  
  5.   
  6. //萃取剂  
  7. template<class I>  
  8. struct Iterator_traits{  
  9.     typedef typename I::value_type value_type;  
  10. };  
  11. //特化 原生指针  
  12. template<class T>  
  13. struct Iterator_traits<T*>{  
  14.     typedef T value_type;  
  15. };  
  16. //特化 原生常指针  
  17. template<class T>  
  18. struct Iterator_traits<const T*>{  
  19.     typedef T value_type;  
  20. };  
  21.   
  22. //真正的交换函数    
  23. template <class Iter1, class Iter2, class T>    
  24. inline void _iter_swap(Iter1 a, Iter2 b, T) {    
  25.   T tmp = *a;    
  26.   *a = *b;    
  27.   *b = tmp;    
  28. }    
  29. //交换两个迭代器所指的元素    
  30. template <class Iter1, class Iter2>    
  31. inline typename Iterator_traits<Iter1>::value_type //利用内嵌型别获取返回值的类型  
  32. iter_swap(Iter1 a, Iter2 b) {    
  33.  _iter_swap(a, b, *a); //模板实参推断   
  34.  return *a;     
  35. }    
  36.   
  37. int main()  
  38. {  
  39.     list<int> l;  
  40.     l.push_back(3);  
  41.     l.push_back(4);  
  42.     cout<<iter_swap(l.begin(),++l.begin())<<endl;  
  43.     return 0;  
  44. }  
         本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985

如何获得C++模版实参推断结果

在《C++ Primer》第五版中,关于模版实参推断,讲述了如下内容 1.类型转换与模版类型参数 2.函数模版的显式实参 3.尾置返回类型 4.类型转换 5.函数指针和实参推断 6.模...
  • zjq2008wd
  • zjq2008wd
  • 2014年11月21日 18:10
  • 711

STL运用的C++技术(3)——模板实参推断

STL是C++标准库的重要组成部分之一,它不仅是一个可复用的组件库,更是一个包含算法与数据结构的软件框架,同时也是C++泛型编程的很好例子。STL中运用了许多C++的高级技术。本文介绍模板实参推断的运...
  • lvfengchang1220
  • lvfengchang1220
  • 2015年05月16日 15:54
  • 215

STL运用的C++技术(3)——模板实参推断 .

STL是C++标准库的重要组成部分之一,它不仅是一个可复用的组件库,更是一个包含算法与数据结构的软件框架,同时也是C++泛型编程的很好例子。STL中运用了许多C++的高级技术。本文介绍模板实参推断的运...
  • ljx0305
  • ljx0305
  • 2013年01月30日 15:33
  • 562

C++学习笔记58——模板实参推断

1,定义 模板实参推断:编译器用来确定实例化哪个函数模板的过程。编译器检查用模板形参指定的实参的类型,它用绑定到模板形参的类型或值自动实例化函数的一个版本。 简单的说,就是(根据调用函数模板的方式...
  • yellowston
  • yellowston
  • 2016年04月19日 23:42
  • 270

C++primer阅读笔记-模板与泛型编程(模板实参推断)

类型转换与模板类型参数 编译器利用调用中的函数实参来确定其模板参数 如果一个函数uxingcan的类型使用了模板类型参数,则采用特殊初始化规则 编译器通常不是对实参进行类型转换,而是生成一个新的模板实...
  • st125475466
  • st125475466
  • 2015年09月06日 11:11
  • 317

模板实参推断与引用

1从左值引用函数参数推断类型 templatevoid f1(T&);当一个函数参数是模板类型参数的一个普通引用时,绑定规则告诉我们,只能传递给他一个左值(如:一个变量或一个返回引用类型的表达式)。...
  • u011402017
  • u011402017
  • 2016年10月16日 14:52
  • 180

模板实参推断

定义:从函数实参确定模板实参的类型和值的过程叫做模板实参推断 《C++ Primer 4th》举例 template//模板类型形参int compare(const Glorp& v1,const ...
  • sheismylife
  • sheismylife
  • 2006年08月20日 21:12
  • 4194

C++模板实参推断

1 类型转换与模板实参 1)自动转换的只有:const转换, 数组及函数到指针的转换 注:不同大小相同元素类型是不同的类型 2)相同模板参数名对应的实参类型必须相同 3)不同模板参数名对应的实参类型可...
  • tangchenchan
  • tangchenchan
  • 2015年07月08日 22:25
  • 758

模板实参推断与函数指针

#include #include using namespace std; template T1 sum(T2 a,T3 b) { T1 c=a+b; return c; }...
  • zongvr
  • zongvr
  • 2010年07月26日 09:36
  • 277

优先队列的STL运用与哈夫曼树的实现

priority_queue是优先队列,简称堆,哈夫曼树的实现需要依靠于堆的操作 堆是一颗二叉树,看似队列又非队列,其具有一定的排列性,我们将从STL库中的priority_queue来进行讲解 ...
  • yyb0802
  • yyb0802
  • 2017年10月31日 20:12
  • 83
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL运用的C++技术(3)——模板实参推断
举报原因:
原因补充:

(最多只允许输入30个字)