zoukankan      html  css  js  c++  java
  • C++ template一些体悟(2)

    class template的一般化设计之外,特别针对某些参数做特殊设计

    #include <iostream>
    
    using namespace std;
    //一般设计
    template<class I, class O>
    class testClass {
    public:
        testClass() {
            cout << "I,O" << endl;
        }
    };
    //以下都是特殊设计
    template<class T>
    class testClass<T, T> {
    public:
        testClass() {
            cout << "T,T" << endl;
        }
    };
    
    template<class T>
    class testClass<T*, T*> {
    public:
        testClass() {
            cout << "T*,T*" << endl;
        }
    };
    
    template<class T>
    class testClass<const T*, T*> {
    public:
        testClass() {
            cout << "const T*,T*" << endl;
        }
    };
    
    int main(int argc, char **argv) {
        testClass<int*, int*> obj1;
        return 0;
    }

    一开始没有找到一般设计和特殊设计有啥关联性,进行一下修改

    template<class I>
    class testClass {
    public:
        testClass() {
            cout << "I,O" << endl;
        }
    };

    编译报错

    error: wrong number of template arguments (2, should be 1)
    

     这才意识到,是先定义了一般设计,才会有特殊设计,且特殊设计满足一般设计的格式,不过编译器在匹配时,会匹配最类似的。

    比如

    上述程序的运行结果是

    T*,T*
    

     而非

    T,T
    

     如果注释

    //template<class T>
    //class testClass<T*, T*> {
    //public:
    //    testClass() {
    //        cout << "T*,T*" << endl;
    //    }
    //};

    运行结果才会是

    T,T
    

    照此思路设计一个typename T的类试试

    #include <iostream>
    
    using namespace std;
    
    //一般设计
    template<class I>
    class testClass {
    public:
        testClass() {
            cout << "I" << endl;
        }
    };
    //特殊化设计
    template<class I>
    class testClass<I*> {
    public:
        testClass() {
            cout << "I*" << endl;
        }
    };
    
    int main(int argc, char **argv) {
        testClass<int*> obj1;
        return 0;
    }

     果然,和我想得差不多,好多文章就把STL源码分析的这段代码抄一下了事,半点分析没有,我也是自己修修改改试出规律的,没看正规文档的解释。

    少壮不识cpp,老大方知cpp可怕
  • 相关阅读:
    mysql 安装
    flying-saucer-pdf使用中字符串过长换行出问题的解决办法
    杂想
    关于MATLAB实验结果求交点问题
    关于学习方向问题
    关于读取文件夹中的图片问题
    关于ROC曲线的碎碎念
    win7(64)+vs2013+opencv3.0配置的辛酸路程
    验证模式和辨识模式
    指纹识别认证
  • 原文地址:https://www.cnblogs.com/Jacket-K/p/9263214.html
Copyright © 2011-2022 走看看