bosthhe1 / cpushpush

0 stars 0 forks source link

非类型模板参数+模板特化 #20

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

对于类模板参数,在前面已经接触很多了,但是除了模板参数,还存在非类型模板参数,非类型模板参数必须是整型(int,char,short,long)

template<class T, size_t N = 10>
class mystack
{
public:
           void push(const T& val)
           {
           }
private:
    T _a[N];
    size_t size;
};
int main()
{
    mystack<int,100> d;//开100个空间
    mystack<int, 200> d1;//开200个空间
    return 0;
}
bosthhe1 commented 1 year ago

对于模板特化有一点像定向调用函数,或者有点像运算符重载,运算符重载后,会去调用特定的运算符重载函数,模板特化也是调用特定的类或者函数

bosthhe1 commented 1 year ago

函数模板(用处不大)

class DATE
{
public:
    DATE(int year = 1970, int monsh = 1, int day = 1)
    {
        _year = year;
        _monsh = monsh;
        _day = day;
    }
    bool operator<(const DATE &d)const;
private:
    int _year;
    int _monsh;
    int _day;
};
bool DATE::operator<(const DATE &d)const
{
    if (_year < d._year)
    {
        return true;
    }
    if (_year == d._year&&_monsh < d._monsh)
    {
        return true;
    }
    if (_year == d._year&&_monsh == d._monsh&&_day < d._day)
    {
        return true;
    }
    return false;
}
template<class T>
bool objless(const T a, const T b)
{
    return a < b;
}
template<>
bool objless<DATE*>(DATE* a,DATE* b)//函数模板特化,需要注意的是,特化的形式必须和模板参数一致,具体看下方讲解
{
    return (*a) < (*b);
}
int main()
{
    cout << objless(1, 2) << endl;
    DATE* p1 = new DATE(1999, 11, 26);
    DATE* p2 = new DATE(1998, 12, 03);
    cout << objless(p1, p2) << endl;
    return 0;
}
bosthhe1 commented 1 year ago

所谓一致就是特化需要和函数模板的传参方式一致,如果函数模板加了引用,那么特化就必须加引用,如果函数模板没加引用,那么特化版本也不能加 image image image

bosthhe1 commented 1 year ago

类模板的模板特化

template<class T,class TD>
class A{
public:
    A(T _a,TD _b)
    {
        cout << "T a,TD b" << endl;
    }
private:
    T a;
    TD b;
};
template<>
class A<int, char>//和函数模板特化差不多
{
public:
    A(int _a,char _b)
    {
        cout << "int a,char b" << endl;
    }
private:
    int a;
    char b;
};

int main()
{
    A<int, int> a(1,2);//调用类模板
    A<int, char> b(1,'c');//调用特化版
    return 0;
}

image