当前位置:   article > 正文

C++之模板(三)

C++之模板(三)

1、缺省模板参数

可以将数据结构类型传递进来,比如=vectop<T>(如果没传就是默认)

把vector当作类型参数来传递,从而使用它的接口然后适配出新的接口。实际上这个Stack称为适配器。有时候可能需要vector,但是又需要超出vector本身自带的功能,这时候就需要适配器,将vector当作参数传进去,嵌入到新写的模板中,这样就能适配原vector和新功能。

Stack.h

  1. #include <stdexcept>
  2. #include <deque>
  3. using namespace std;
  4. template <typename T, typename CONT = deque<T> >
  5. class Stack
  6. {
  7. public:
  8. explicit Stack();
  9. ~Stack();
  10. void Push(const T& elem);
  11. void Pop();
  12. T& Top();
  13. const T& Top() const;
  14. bool Empty() const;
  15. private:
  16. CONT c_;
  17. };
  18. template <typename T, typename CONT>
  19. Stack<T, CONT>::Stack() : c_()
  20. {
  21. }
  22. template <typename T, typename CONT>
  23. Stack<T, CONT>::~Stack() {
  24. }
  25. template <typename T, typename CONT>
  26. void Stack<T, CONT>::Push(const T& elem)
  27. {
  28. c_.push_back(elem);
  29. }
  30. template <typename T, typename CONT>
  31. void Stack<T, CONT>::Pop()
  32. {
  33. c_.pop_back();
  34. }
  35. template <typename T, typename CONT>
  36. T& Stack<T, CONT>::Top()
  37. {
  38. return c_.back();
  39. }
  40. template <typename T, typename CONT>
  41. const T& Stack<T, CONT>::Top() const
  42. {
  43. return c_.back();
  44. }
  45. template <typename T, typename CONT>
  46. bool Stack<T, CONT>::Empty() const {
  47. return c_.empty();
  48. }

main.cpp

  1. #include <iostream>
  2. using namespace std;
  3. #include "Stack.h"
  4. #include <vector>
  5. int main() {
  6. Stack<int, vector<int> > s;
  7. s.Push(1);
  8. s.Push(2);
  9. s.Push(3);
  10. while (!s.Empty())
  11. {
  12. cout << s.Top() << endl;
  13. s.Pop();
  14. }
  15. return 0;
  16. }
  17. // 输出
  18. 3
  19. 2
  20. 1

2、成员模板

上面的最后一行会报错,因为d已经定义成了double型,但是此时传入了int型。所以要把成员函数定义成模板。

注意这样子定义的话,x不能直接访问私有成员value,因为调用Assign的时候,参数的类型有可能和对象的类型不一样,不一样的时候,其实是两个类,类之间不能直接访问私有成员。同一种类型才能访问私有成员。

3、关键字typename的作用

如果没有typename,那么编译器就会解析成这样:这个T是一个类型,然后::域运算符,取到这个类中的静态数据成员SubType,然后*被解析成乘以,变成了SubType 乘以 ptr;

所以有typename则表示,后面的是一个类型,定义一个T::SubType类型的指针ptr

  1. template <typename T>
  2. class MyClass
  3. {
  4. private:
  5. typename T::SubType* ptr_;
  6. };
  7. class Test
  8. {
  9. public:
  10. typedef int SubType; // 这边的话必须声明为public
  11. };
  12. int main() {
  13. MyClass<Test> myclass;
  14. }

4、派生类和模板

5、面向对象与泛型编程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/739536
推荐阅读
相关标签
  

闽ICP备14008679号