zoukankan      html  css  js  c++  java
  • C++程序设计方法4:模板特化

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

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

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

    如:

      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;
    }
    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    redhat 5 中文乱码
    生成树
    交换机端口模式
    链路聚合
    AP注册
    信息收集
    Python 25 Django跨域请求
    Python 24 Django之csrf中间件
    Python 23 Django基础
    Python 21 Flask(三)第三方组件
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6696826.html
Copyright © 2011-2022 走看看