学会思考
刻意练习

模板参数的具体化/特殊化

有时,有些类型不适用,则需要对模板进行特殊化处理,这称为“模板特化”

对函数模板,如果有多个模板参数,则特化时必须提供所有参数的特例类型,不能部分特化;

 

如:

  char *sum(char *,char *);

在函数名后用<>括号括起具体类型

template<> char* sum<char*>(char* a,char* b){...}

由编译器推导出具体的类型,函数名为普通形式:

template<> char *sum(char* a ,char *b){}

 

对于类模板,允许部分特化,即部分限制模板的通用性,如:
//通用模板类

template<class T1,class T2>class A{...};

//部分特化的模板类:第二个类型参数指定为int

template<class T1>class A<T1,int>{...};

若指定所有的类型,则<>内将为空

template<>class A<int,int>{...};

#include <iostream>
using namespace std;

template<typename T> T sum(T a, T b)
{
    return a + b;
}
//因为是特化,类型已知,所以模板参数列表为空;
template<>
char* sum(char* a, char* b)
{
    char* p = new char[strlen(a) + strlen(b) + 1];
    strcpy(p, a);
    strcat(p, b);
    return p;
}

int main()
{
    cout << sum(3, 4) << " " << sum(5.1, 13.8) << endl;
    //调用普通的函数模板
    char *str1 = "hello,", *str2 = "world";
    //调用特例化的函数模板
    cout << sum(str1, str2) << endl;

    return 0;
}

类模板的特化实例:

#include <iostream>
using namespace std;

template<typename T>
class Sum
{
    T a, b;
public:
    Sum(T op1, T op2) :a(op1), b(op2) {}
    T DoIt() { return a + b;}
};
//替换T,特例化
template<>class Sum<char*>
{
    char *str1, *str2;
public:
    Sum(char *s1, char *s2) :str1(s1), str2(s2) {}
    char *DoIt()
    {
        char *tmp = new char[strlen(str1) + strlen(str2) + 1];
        strcpy(tmp, str1);
        strcat(tmp, str2);
        return tmp;
    }
};

int main()
{
    Sum<int> obj1(3, 4);
    cout << obj1.DoIt() << endl;

    char *s1 = "hello", *s2 = "THU";
    Sum<char *> obj2(s1, s2);
    cout << obj2.DoIt() << endl;

    return 0;
}

 

posted on 2017-04-11 22:45  Worty  阅读(460)  评论(0编辑  收藏  举报