当前位置:首页 >> 编程开发 >> Visual C++ >> 内容

C++中成员函数(member function)模板(template) 详解

时间:2014/11/20 作者:平凡之路 来源:xuhantao.com 浏览:

成员模板(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.cn/Programming/cplus/

相关文章
  • 没有相关文章
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1