关于模板

注:编译器版本 VS2013;

#ifndef __TEST_H__
#define __TEST_H__
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
#endif

函数模板

#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
template<typename T>
T Add(T left, T right)
{
    return left + right;
}
int Add(int left, int right)
{
    return left + right;
}
double Add(double left, double right)
{
    return left + right;
}

int main()
{
    cout << Add(10, 20) << endl;
    cout << Add<>(10, 20) << endl;
    cout << Add(10.1, 20.0) << endl;
    cout << Add(10, (int)20.0) << endl;
    cout << Add<int>(10, 20.0) << endl;
    system("pause");
    return 0;
}
隐式实例化 Add(10,20),通过参数推演出来T的类型,但如果有一个处理int类型的函数,就会直接调用该函数,不会再用模板函数实例化处理int类型的加法函数。
Add<>(10,20)必须要模板函数实例化出一个函数,
Add(1,'2')像这样无法实例化解决的函数。
1:强转
a:显式强转
Add(10, (int)20.0)
b.显式实例化
Add<int>(1,'2') 隐士强转,会将字符强转为int

模板函数重载

模板函数重载
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
template<typename T>  
const T& Max(const T& left, const T& right)
{
    return(left > right) ? left : right;
}
//两个函数模板构成重载
template<typename T> 
const T& Max(const T& left, const T& mid, const T& right)
{
    const T& tmp = Max(left, right);
    return(tmp > right) ? tmp : right;
}
int main()
{
cout << Max(1, 2) << endl;
cout << Max(1, 2, 3) << endl;
system("pause");
    return 0;
}

模板函数特化

特化即特殊化,

模板函数特化
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
template<class T>  //1111
const T& Max(const T& left, const T& right)
{
    return(left > right) ? left : right;
}
模板函数特化,必须给出基础版本  
template<>
const char*& Max<const char*&>(const char*& Pleft, const char*& Pright)
{
    if (strcmp(Pleft, Pright) > 0)
    {
        return Pleft;
    }
    return Pright;
}
int main()
{
    const char* p1 = "hello"; 
    const char* p2 = "word";
    cout << Max<const char* &>(p1, p2) << endl;
    //比较两个地址
    //cout << Max("hello", "word") << endl; 
    return 0;
}

特化版本和实例化版本的重载

#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
template<typename T>
void Func(const T& x)
{
    count << "T" << x << endl;
}
void Func(const string& s)
{
    cout << "string" << s << endl;//是上面函数模板的特化版本
}
int main()
{
    Func(1);//void Func(const int& x)  ,实例化出来的函数和上面的特化版本的函数构成函数重载,函数名相同,参数类型不同
    Func(string("aaaa"));
    system("pause");
    return 0;
}

模板类定义格式及其特化

分为全特化和偏特化;

#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
template<typename T>
class MyClass
{
public:
    MyClass()
    {
        cout << "MyClass(T)" << endl;
    }
    ~MyClass()
    {
        cout << "~MyClass(T)" << endl;
    }

private:
    T a;
};
//模板类特化
template<>
class MyClass<string>
{
public:
    MyClass()
    {
        cout << "MyClass(string)" << endl;
    }
    ~MyClass()
    {
        cout << "~MyClass(string)" << endl;
    }
private:
    string a;
};

int main()
{
    MyClass<int>s1;
    MyClass<string>s2;
    system("pause");
    return 0;
}

这里写图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
template<typename T1,typename T2>
class MyClass
{
public:
    MyClass()
    {
        cout << "MyClass<T1,T2>" << endl;
    }
    ~MyClass()
    {
        cout << "~MyClass<T1,T2>" << endl;
    }
private:
    T1 a1;
    T2 a2;
};
template<>
class MyClass<int,char>//全特化
{
public:
    MyClass()
    {
        cout << "MyClass<int,char>" << endl;
    }
    ~MyClass()
    {
        cout << "~MyClass<int,char>" << endl;
    }
private:
    int a1;
    char a2;
};
template<typename T2>
class MyClass<int,T2>//偏特化
{
public:
    MyClass()
    {
        cout << "MyClass<int,T2>" << endl;
    }
    ~MyClass()
    {
        cout << "~MyClass<int,T2>" << endl;
    }
private:
    int a1;
    T2 a2;
};
template<typename T1,typename T2>
class MyClass<T1*,T2*>//偏特化,参数进一步限制
{
public:
    MyClass()
    {
        cout << "MyClass<T1*,T2*>" << endl;
    }
    ~MyClass()
    {
        cout << "~MyClass<T1*,T2*>" << endl;
    }

private:
    T1 *a1;
    T2 *a2;
};
template<typename T1, typename T2>
class MyClass<T1&, T2*>//偏特化,
{
public:
    MyClass()
    {
        cout << "MyClass<T1&,T2*>" << endl;
    }
    ~MyClass()
    {
        cout << "~MyClass<T1&,T2*>" << endl;
    }

private:
    T1 a1;
    T2 a2;
};
int main()
{
    MyClass <double, double> m1;
    MyClass<int,char>m2;
    MyClass<int,double>m3;
    MyClass<int*, int*>m4;
    MyClass<int&, int*>m5;
    system("pause");
    return 0;
}

这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值