学不会的 吸佳佳 -- 全特化和偏特化

luckyFang 2021年02月21日 97次浏览
#include <iostream>

/**
 * @file template.cpp
 * @author luckyFang
 * @date 2021-2-21
 * 全特化和偏特化
 *  编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。
 * 
 *  全特化:
 *      - 对于函数模板只有全特化没有偏特化.
 *      - 全特化参数列表为空
 *          template<> xxxx
 *  偏特化:
 *      - 函数不能偏特化, 类可以偏特化.
 * 
 *  全特化 就是全部指定,偏特化就是局部指定。
 * 
 * */


template<typename T,typename U>
class Printer
{
private:
    /* data */
public:

    void doSomeThing(T t,U u){
        std::cout<<"T:"<<typeid(t).name()<<std::endl;
        std::cout<<"U:"<<typeid(u).name()<<std::endl;
    }
};


// 偏特化
template<typename T>
class Printer<T,bool>
{
    public:
    void doSomeThing(T t,T u){
        std::cout<<"T:"<<typeid(t).name()<<std::endl;
        std::cout<<"U:"<<typeid(u).name()<<std::endl;
        std::cout<<"偏特化"<<std::endl;
    }
};






template<typename T>
void sayHello(T t){
    std::cout<<"编译器:我就知道你不行!"<<std::endl;
    std::cout<<t<<std::endl;
}



// 全特化
template<> void sayHello<int>(int t){
    std::cout<<"编译器:你行你来!"<<std::endl;
    std::cout<<t<<std::endl;
}








int main(){
    Printer<double,int> p1{};
    Printer<const char,int> p2{};
    Printer <int,bool>p3{};

    p1.doSomeThing(1.2,20);
    p2.doSomeThing('A',1);
    p3.doSomeThing(1,true);
    sayHello("a");
    sayHello(1);

    return 0;
}