C++模板

函数模板

为什么要使用模板

我们看一个例子:函数重载

int max(int a,int b){
    return a>b?a:b;
}
int max(int a,float b){
    return a>b?a:b;
}
int max(float a,float b){
    return a>b?a:b;
}

尽管函数重载很方便:可以将同功能的函数设置为同名
但是,如果我们需要修改函数内部逻辑,就需要将每个函数都修改一遍,不方便维护,且函数重载并没有代码重用

函数模板定义

template<typename T>    //假设类型名为T
T getMax(T a, T b)      //返回值,a和b的类型都为T
{
     return a>b?a:b;
}

使用函数模板

int main(int argc, const char * argv[]) {
    cout<<   getMax<int>(1, 2)          <<endl;     //输出2
    cout<<   getMax<double>(1.2, 2.3)   <<endl;     //输出2.3
    cout<<   getMax<float>(1.2, 2.3)    <<endl;     //输出2.3
    cout<<   getMax(1.2, 2.3)           <<endl;     //省略类型(自动判断数据类型)
}

多类型的函数模板

template<typename T1,typename T2,typename T3>    //假设类型名为T
T3 getMax(T1 a, T2 b)      //返回值,a和b的类型都为T
{
     return a>b?a:b;
}
int main(int argc, const char * argv[]) {
    cout<<   getMax<int,int,int>(1, 2)               <<endl;     //输出2
    cout<<   getMax<double,double,double>(1.2, 2.3)  <<endl;     //输出2.3
    cout<<   getMax<float,float,float>(1.2, 2.3)     <<endl;     //输出2.3
    cout<<   getMax<int,float,float>(2, 2.3)         <<endl;
}

类模板

类模板定义

template <class T>	//假设类型T
class A
{
public:
    void hello(T a){	//将变量a设置为T类型
        cout<<"hello "<<a<<endl;
    }
};

使用类模板

int main(int argc, const char * argv[]) {
    A<string> a;		//将类型T实例化为string类型
    a.hello(“world”);	//输出hello world
}

类模板中使用函数模板

template <class T>	//假设类型T
class A{
public:
    template <class T2>     //成员函数模板
    void Func(T2 t) {
        cout << t<<endl;
    }
};
int main(int argc, const char * argv[]) {
    A<int> a;           //初始化对象时只需要指定**类模板中的类型**
    a.Func<int>('A');   //输出65
    a.Func("hello");    //输出hello(自动判断数据类型)
    return 0;
}

posted @ 2020-03-21 20:37  NetRookieX  阅读(1)  评论(0编辑  收藏  举报