C++中成員函數(member function)模板(template) 詳解

來源:互聯網
上載者:User

成員模板(member template) 既可以在普通類(ordinary class), 也可以在類模板(class template);

在普通類中, 在使用成員函數時, 不用提供模板參數, 函數可以根據使用的參數,

自動推導(deduce)模板實參(template argument)對應模板形參(template parameter);

在類模板中, 成員函數的模板參數(template parameter)可以和類的模板參數不同, 但在定義(definition)中,

必須添加兩個模板參數列表(template parameter list), 第一個為類的, 第二個為成員函數的;

代碼如下:

/*  * cppprimer.cpp  *  *  Created on: 2013.11.24  *      Author: Caroline  */      /*eclipse cdt, gcc 4.8.1*/      #include <iostream>  #include <functional>  #include <memory>  #include <algorithm>  #include <string>  #include <vector>  #include <deque>  #include <iterator>        //函數模板預設參數  template <typename T, typename F = std::less<T>>  int compare (const T &v1, const T &v2, F f = F())  {      if (f(v1, v2)) return -1;      if (f(v2, v1)) return 1;      return 0;  }        class DebugDelete {  public:      DebugDelete (std::ostream &s = std::cerr) : os (s) { }      template <typename T> void operator() (T *p) const {          os << "deleting unique_ptr" << std::endl; delete p;      }  private:      std::ostream &os;  };        template <typename T> class Blob {  public:      template <typename It> Blob (It b, It e);      /*template <typename It> Blob (It b, It e) {         std::sort(b, e);     }*/};        template <typename T>  template <typename It>  Blob<T>::Blob (It b, It e) {          std::sort(b, e); //容器需要允許被排序  }        int main (void) {            std::cout << "compare (0, 42) = " << compare (0, 42) << std::endl;            double* p = new double;      DebugDelete d;      d(p); //使用時, 可以自動推倒模板      int* ip = new int;      DebugDelete() (ip);      std::unique_ptr<int, DebugDelete> pi (new int, DebugDelete());      std::unique_ptr<std::string, DebugDelete> ps (new std::string, DebugDelete());            int ia[] = {9, 8, 7, 6, 5};      std::vector<long> vi = {5, 4, 3, 2, 1, 0};      std::deque<std::string> w = {"lady", "girl", "woman", "now"};            Blob<int> a1(std::begin(ia), std::end(ia));      Blob<int> a2(vi.begin(), vi.end());      Blob<std::string> a3(w.begin(), w.end());            std::cout << "int ia[] = ";      for (const auto i : ia) { std::cout << i << " "; }      std::cout << std::endl;      std::cout << "std::vector<long> vi = ";      for (const auto i : vi) { std::cout << i << " "; }      std::cout << std::endl;      std::cout << "std::list<const char*> w = ";      for (const auto i : w) { std::cout << i << " "; }      std::cout << std::endl;            return 0;        }

輸出:

deleting unique_ptr  deleting unique_ptr  deleting unique_ptr  deleting unique_ptr  compare (0, 42) = -1  int ia[] = 5 6 7 8 9   std::vector<long> vi = 0 1 2 3 4 5   std::list<const char*> w = girl lady now woman

作者:csdn部落格 Spike_King

更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.