CPP Templates 之 模板的显式特化技巧

模板的显式特化的注意事项:

一、
指定的模板实参列表必须喝相应的模板参数列表一一对应。例如,我们不能用一个
非类型值来替换一个模板参数。然而,如果模板参数具有缺省模板实参,那么用来替换的

模板实参就是可选的:

template <typename T>
class Types{
public:
    typedef int I;
};

template <typename T,typename U=typename Types<T>::I>
class S;

template<>
class S<void>//ok
{
public:
    void f();
};

template<>
class S<char,char>;//ok

template<>

template<> class S<char,0>;//error.不能用0来代替U

二、全局成员特化

#include <iostream>

using namespace std;

template<typename T>
class Outer{/1
public:
    template<typename U>
    class Inner
    {
    private:
        static int count;
    };
    static int code;//4
    void print()const//5
    {
        std::cout<<"generic"<<endl;
    }
}
/*在4处的code和5处print(),这两个普通成员都具有一个外围类模板,因此需要用一个
 *template<>前缀说明:后面将用一个模板实参集来对他进行全局特化
 */
template<>
int Outer<void>::code=12;

template<>
void Outer<void>::print() const
{
    std::cout<<"Outer<void>"<<endl;
}
/*1.上面的这些定义会用于代替类Outer<void>在4和5处的泛型定义;但是类Outer<void>的
 *其他成员仍然默认地产生于1处的模板。
 *2.在提供了上述声明后,就不能再次提供Outer<void>的显示特化
 */

posted on 2009-11-15 21:18  ATAK  阅读(451)  评论(0编辑  收藏  举报

导航