zoukankan      html  css  js  c++  java
  • C++模板(Templates)

    模板(template)是泛型编程的基础,"泛型"的含义就是没有不依赖具体的数据类型.模板的引入是为了创建一般性的类(模板类)或者函数(模板函数).典型的容器比如迭代器/算法等是泛型编程的典型案例.例如,定义了一个vector,可以使用vector<int>, vector<string>, vector<vector>等等.

    函数模板

    模板函数的一般定义方式为: 这里的type可以看做是代表了一种数据类型的占位符名称, 在函数内部的定义中可以使用它.

    template <class type> 
    ret-type func-name(parameter list){ // body of function }

    举例分析如下. 注意, typename关键词和class关键词的作用是相同的,class关键词会让你产生是否定义的type只能是类,而不能是其他的数据类型? 为了避免这个歧义,这里引入了typename!!!

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 template <typename T>
     7 inline T const& Max (T const& a, T const& b){
     8     return a < b ? b:a;
     9 }
    10 
    11 int main() {
    12 
    13     int i = 39;
    14     int j = 20;
    15     cout << "Max(i, j)" << Max(i, j) << endl;    # Max(i,j): 39
    16 
    17     double f1 = 13.5;
    18     double f2 = 20.7;
    19     cout << "Max(f1, f2)" << Max(f1, f2) << endl;  # Max(f1, f2): 20.7
    20 
    21     string s1 = "Hello";
    22     string s2 = "World";
    23     cout << "Max(s1, s2)" << Max(s1, s2) << endl;   # Max(s1, s2): World
    24 
    25     return 0;
    26 
    27 }

    类模板

    就像我们定义函数模板一样, 这里也可以定义类模板. 声明类模板的一般形式为:

    template <class type>
    class class-name{
      
    
    }

    举例:

    #include <iostream>
    #include <vector>
    #include <cstdlib>
    #include <string>
    #include <stdexcept>
    
    using namespace std;
    
    template <class T>
    class Stack { 
       private: 
          vector<T> elems;     // elements 
    
       public: 
          void push(T const&);  // push element 
          void pop();               // pop element 
          T top() const;            // return top element 
          bool empty() const{       // return true if empty.
             return elems.empty(); 
          } 
    }; 
    
    template <class T>
    void Stack<T>::push (T const& elem) { 
       // append copy of passed element 
       elems.push_back(elem);    
    } 
    
    template <class T>
    void Stack<T>::pop () { 
       if (elems.empty()) { 
          throw out_of_range("Stack<>::pop(): empty stack"); 
       }
        
       // remove last element 
       elems.pop_back();         
    } 
    
    template <class T>
    T Stack<T>::top () const { 
       if (elems.empty()) { 
          throw out_of_range("Stack<>::top(): empty stack"); 
       }
        
       // return copy of last element 
       return elems.back();      
    } 
    
    int main() { 
       try { 
          Stack<int>         intStack;  // stack of ints 
          Stack<string> stringStack;    // stack of strings 
    
          // manipulate int stack 
          intStack.push(7); 
          cout << intStack.top() <<endl;   // 7
    
          // manipulate string stack 
          stringStack.push("hello"); 
          cout << stringStack.top() << std::endl;   // hello
          stringStack.pop(); 
          stringStack.pop(); 
       }catch (exception const& ex) { 
          cerr << "Exception: " << ex.what() <<endl;  // Exception: Stack<>::pop(): empty stack
          return -1;
       } 
    } 

    参考:

    [1] C++ Templates: https://www.tutorialspoint.com/cplusplus/cpp_templates.htm 

  • 相关阅读:
    编程总结2
    编程总结3
    《秋季学期学习总结》
    《人生路上对我影响最大的三位老师》
    第八周编程总结
    第七周编程总结
    第六周编程总结
    第五周作业
    第四周编程总结
    第三周编程总结
  • 原文地址:https://www.cnblogs.com/zhao441354231/p/6025856.html
Copyright © 2011-2022 走看看