C++模板

       模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

函数模板如下面的例子:

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

      求两个整数的最大值,func_max()的参数为int类型,如果我们需要求两个float型数的最大值,必须定义一个几乎一模一样的函数,这样就很容易造成代码的冗杂和重复。

      为了解决类似的问题,C++衍生出了模板的概念。把类型参数化。

template <class T> T func_max(T a, T b)
{
    return a>b?a:b;
}

int main()
{

    int a1 = 1,a2 = 2;
    printf("result:%d\n",func_max(a1,a2));
    double b1 = 1.001,b2 = 0.003;
    printf("result:%f\n",func_max(b1,b2));

}

结果:

result:2
result:1.001000

这里的T就是指参数的类型,他可以表示int、float、double等等,但是它只能表示一种类型。例如在上面的例子当中,如果我们比较a1和b2,编译时则会报错。

template <class T> T func_max(T a, T b)
{
    return a>b?a:b;
}

int main()
{

    int a1 = 1,a2 = 2;
    printf("result:%d\n",func_max(a1,a2));
    double b1 = 1.001,b2 = 0.003;
    printf("result:%f\n",func_max(b1,b2));

    printf("result:%f\n",func_max(a1,b2));  //编译报错

}
template <class T,typename M> T func_max(T a, M b)
{
    return a>b?a:b;
}

int main()
{

    int a1 = 1,a2 = 2;
    printf("result:%d\n",func_max(a1,a2));
    double b1 = 1.001,b2 = 0.003;
    printf("result:%f\n",func_max(b1,b2));

    printf("result:%d\n",func_max(a1,b2));

}

如果需要参数化多个类型,写法如上。注意返回值为第一个参数的类型。模板中,用class或者typename都可以。

 

类模板用法和函数模板相差不大:

template <typename T,class M>
class Test
{
    private:
        T a;
        M b;
    public:
        Test(T a,M b)
        {
            this->a = a;
            this->b = b;
        }
        void show()
        {
            cout<<"first: "<<a<<endl;
            cout<<"second:"<<b<<endl;
        }
};

int main()
{

   Test<int,int> *test_1 = new Test<int,int>(3,5);
   test_1->show();

   Test<int,double> test_2(1,3.23);
   test_2.show();

   Test<int,double> test_3(2.12,3.12);//2.12会被强转为int
   test_3.show();

}

结果:

first: 3
second:5
first: 1
second:3.23
first: 2
second:3.12

我们所使用的vector<int> test,其实就是使用了类模板的方式去实现的。

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页