C++的模板机制

    C++中提供了两种模板机制,分别是数模板类模板。下面介绍这两种类型。

    函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称函数模板。凡是函数体相同的函数都可用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参类型来取代模板中的虚拟内型,从而实现不同函数功能的调用。

#include <iostream>

using namespace std;

int add(int x,int y)  // 普通函数
{
    cout << "int add(int x,int y)" << endl;
    return (x + y);
}

template <typename T>   // 模板函数
T add(T x,T y)
{
    cout << "T add(T x,T y)" << endl;//当普通函数与模板函数同名时,优先调用普通函数
    return (x + y);
}
int main()
{
    add(1,2);
    return 0;
}

template <typename T> 只能定义以下一个函数

普通函数有默认类型转换,但是函数模板没有类型转换

#include <iostream>

using namespace std;

void print(int x,int y)
{
    cout << "x = " << x << " y= " << y << endl;
}

template<typename T>  //只能作用于以下一个函数,如果要写一个模板函数,必须写template
void print1(T x,T y)
{
    cout << "x = " << x << " y= " << y << endl;

}
int main()
{
    print(1,'a');   //普通函数有类型转换 
    //print1(98,'b');  // 模板函数没有类型转换
    return 0;
}

模板函数调用时有隐式调用和显示调用。

#include  <iostream>

using namespace std;
template <typename T>
void print(T a,T b)
{
    cout << "a = " << a << " b = " << b << endl;
}

int main()
{
    print(1,2);   // 隐式调用
    print<int>(97,'c');  // 显示调用
    return 0;
}

    类模板,使程序(算法)可以使逻辑上抽象,把处理的对象类型作为参数传递,凡是类体内的对象相同时可用这个类模板来代替,不必重复定义多个类。

#include<iostream>
#include<cstring>
using namespace std;

template <typename T>  // 模板类
class Parent
{
    protected:
        T m_a;
    public:
        Parent(T a)
        {
            m_a = a;
        }
};

/*class Child:public Parent<int>  //模板类派生出一个普通类
{
 private:
        int m_b;
    public:
        Child(int a,int b):Parent<int>(a)
    {
        m_b = b;
    }
        void show()
        {
            cout << m_a << " " << m_b << endl;
        }
};
*/
template <typename T1,typename T2>   //模板类派生出模板
class Student:public Parent<T1>
{
    private:
        T2 m_b;
 public:
        Student(T1 a,T2 b):Parent<T1>(a)
        {
            m_b = b;
        }
        void show()
        {
            cout << Parent<T1>::m_a << " " << m_b << endl; //因为二次编译,不加限定符,无法确定是哪个m_a;
        }
};

int main()
{
    //Child c(1,2);
    //c.show();
    Student<int,char> b(10,'a');
    b.show();

  return 0;
}

类模板需要重载时需要重新定义一个模板看类。

#include<iostream>

using namespace std;


template <typename T1>
void myswap(T1& x,T1& y)
{
    T1 tmp;
    tmp = x;
    x = y;
    y = tmp;
}
template <typename T1,typename T2>   //函数模板重载,需重新定义一个模板类
void myswap(T1& x,T2& y)
{
    T1 tmp;
    tmp = x;
 x = y;
    y = tmp;
    cout << "x = " << x << " y = " << y << endl;

}


int main()
{
    int a = 1,b = 3;
    myswap(a,b);     //隐式调用
    cout << "a = " << a << " b= " << b << endl;

    double x = 1.11,y = 2.22;
    myswap(x,y);
    cout << "x= " << x << " y= " << y << endl;

    char c = 'd';
 double e = 99;
    int d = 97;
    myswap<int,char>(d,c);  //显示调用

    return 0;
}


猜你喜欢

转载自blog.csdn.net/wsqfly06/article/details/80184409