• 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>的显示特化
     */
  • 相关阅读:
    如何在存储过程中临时设置数据库兼容级别
    PHP中如何防止SQL注入
    Android 源码下载
    HDU 2517 棋盘分割
    OceanBase里面的rowkey是什么概念,是由哪些要素构成的?
    JavaScript的递归之更多例子
    C++库研究笔记——生成一组随机数
    Neutron 如何支持多种 network provider
    理解 Neutron Server 分层模型
    Neutron 物理部署方案
  • 原文地址:https://www.cnblogs.com/bayonetxxx/p/1603482.html
Copyright © 2020-2023  润新知