码迷,mamicode.com
首页 > 其他好文 > 详细

类模板特化

时间:2016-05-13 01:17:25      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

主类模板Stack,使用vector构建,实现栈的功能。

template <typename T>
class Stack {
private:
    std::vector<T> elems;
public:
    void push(T const &elem){
        elems.push_back(elem);
    }
    void pop(){
        if(elems.empty()) return;
        elems.pop_back();
    }
    T top() const{
        if(elems.empty()) return;
        return elems.back();
    }
}

若模板参数是string,我们需要使用deque而不是vector来存放栈元素。这需要对类模板进行特化处理。看下面代码段。

template<>
class Stack<std::string> {  //模板参数为特定string
private:
    std::deque<std::string> elems;
public:
    void push(std::string const &elem){
        elems.push_back(elem);
    }
    void pop(){
        if(elems.empty()) return;
        elems.pop_back();
    }
    std::string top() const{
        if(elems.empty()) return;
        return elems.back();
    }
}

实例化后的模板称为特化模板类。在这个代码段中,特化模板类只针对一个具体的类型(std::string),这种特化被称为完全特化。对于完全特化,首行template尖括号中内容应该为空。上述代码用deque完成栈操作。

有完全特化,就有部分特化。看下面代码。

template <typename T>
class Stack<T*> {
private:
    std::list<T*> elems;
public:
    void push(T* &elem){
        elems.push_front(elem);
    }
    .... //same
}

首行声明T为模板参数,行2表示当模板参数需要是指针时,则不使用主类模板,而用特化模板。

一般情况下,设有一个主类模板:

template <typename T1,typename T2,...typename Tn>
class C {
    ...
}

特化的类模板应该具有的形式是:

template <typename P1,typename P2,...typename PN>
class C<type1,type2,...typeN> {
    ...
}

当主类模板的N个模板参数分别具有行2中的类型type1,type2…,时,编译器将使用特化类模板(而不是主类模板)中的代码来进行实例化操作。
行2中的type2(或者其它任意的一个)可以是一个确定的类型比如int,也可以是一个模板参数。对于后一种情形,需要在首行使用typename声明type2是一个类型名。例如:

template <typename T1,typename T2>//主类模板
class Myclass {
    ...
}

则以下代码定义了一个特化类模板,用来处理T2为int的情形:

template <typename T>
class Myclass<T,int> { //T2为int
    ...
}

而下面代码用来处理T1和T2都为指针的情形:

template <typename T1,typename T2>
class Myclass<T1*,T2*> {
    ...
}

类模板特化

标签:

原文地址:http://blog.csdn.net/qq_34256375/article/details/51345337

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!