程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中成員函數(member function)模板(template) 詳解

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

編輯:關於C++

成員模板(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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved