• C++模板的偏特化与全特化


    模板的声明

    类模板和函数模板的声明方式是一样的,在类定义/模板定义之前声明模板参数列表。例如:

    // 类模板
    template <typename T1, typename T2>
    class A{
        T1 data1;
        T2 data2;
    };
    
    // 函数模板
    template <typename T>
    T max(const T lhs, const T rhs){   
        return lhs > rhs ? lhs : rhs;
    }
    
    // 结构体模板
    template<typename T>
    struct StackNode
    {
      struct T data;
      struct StackNode<T> *next;
    };

    全特化

    通过全特化一个模板,可以对一个特定参数集合自定义当前模板,类模板和函数模板都可以全特化。 全特化的模板参数列表应当是空的,并且应当给出”模板实参”列表:

    // 全特化类模板
    template <>
    class A<int, double>{
        int data1;
        double data2;
    };
    
    // 函数模板
    template <>
    int max(const int lhs, const int rhs){   
        return lhs > rhs ? lhs : rhs;
    }
    
    // 函数模板
    template<>
    struct StackNode <int>{
      struct int data;
      struct StackNode<int> *Next;
    } 

    注意类模板的全特化时在类名后给出了”模板实参”,但函数模板的函数名后没有给出”模板实参”。 这是因为编译器根据int max(const int, const int)的函数签名可以推导出来它是T max(const T, const T)的特化。

    偏特化

    类似于全特化,偏特化也是为了给自定义一个参数集合的模板,但偏特化后的模板需要进一步的实例化才能形成确定的签名。 值得注意的是函数模板不允许偏特化,这一点在Effective C++: Item 25中有更详细的讨论。 偏特化也是以template来声明的,需要给出剩余的”模板形参”和必要的”模板实参”。例如:

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

    函数模板是不允许偏特化的,下面的声明会编译错:

    template <class T1, class T2>
    void f(){}
    
    template <class T2>
    void f<int, T2>(){}
  • 相关阅读:
    2.Mysql集群------Mycat读写分离
    ASP.NET Core 认证与授权[4]:JwtBearer认证
    API做翻页的两种思路
    C# 8
    ASP.NET Core 认证与授权[2]:Cookie认证
    ASP.NET Core 认证与授权[1]:初识认证
    Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截
    C#中out和ref的区别
    存储过程的优缺点
    存储过程的作用和意义,讲的很好
  • 原文地址:https://www.cnblogs.com/clemente/p/10823729.html
Copyright © 2020-2023  润新知