c++函数模板

函数模板概念:用函数或类,不具体指定其类内部的类型和函数的形参类型,用一个虚拟的类型来代表

#创建交换两个变量的函数模板
template <typename anytype>
void Swap(anytype &a,anytype &b)
{
    anytype tmp;
    tmp = a;
    a = b;
    b = tmp;
}
#注意事项
可以为类的成员函数创建模板,但是不能给虚函数和析构函数创建模板
使用函数模板时,如果是自动类型推导,不会发生隐式类型转换,如果显式指定了函数模板的数据类型,可以发生隐式类型转换。

 多个通用类型参数的函数模板

template <typename T1,typename T2)
void show(T1,T2)
{
    cout<<"name is"<<T1<<"   age is T2);
}
int main()
{
    show("bob",20);
}

函数模板具体化 

提供一个具体参数的函数定义,当编译器找到与之相匹的具体化定义时使用该定义,不在使用函数模板
#具体化语法
#template<> void 函数模板名<数据类型>(参数列表) //和下行效果一样
template<> void 函数模板名(参数列表)
{
  //函数体
}

编译器使用各种函数的规则

#优先级
普通函数》具体化》常规模板

 如果希望使用函数模板,可以用空模板参数强制使用函数模板。

例:Swap<>(a,b);


 如果函数模板能产生更好的匹配,将优先于非模板函数。

 

函数模板分文件编写

#.h文件中进行函数声明
template <typename T>
1 void Swap(T a, T b); //函数具体化声明

2 void Swap(T a, T b); //普通函数声明

  3 template <typename T> //普通函数模板声明和定义要放在一起,不然会报错

  void Swap(T a, T b)// 函数模板
  {cout <<"使用了函数模板。 \n”}

#注意:具体化参数函数在头文件声明后.c文件中依旧要加template <typename T>

例:template <>

void Swap(T a, T b)// 函数模板

{cout <<"hello。\n”}



类模板概念:

类模板是通用类的描述,使用任意类型(泛型)来描述类的定义。
使用类模板的时候,指定具体的数据类型,让编译器生成该类型的类定义。

语法:
template <class T>
class 类模板名

{类的定义;}

#类模板示例
template <class T1,class T2>
class AA
{
public:
   T1 m_a;// 通用类型用于成员变量
   T2 m_b;
// 通用类型用于成员变量 AA(){} // 默认构造函数是空的
  
// 通用类型用于成员函数的参数。
   AA(T1 a,T2 b):m_a(a),m_b(b)
// 通用类型用于成员函数的返回值
   T1 geta()
// 获取成员m a的值
  {
   T1 a = 2;// 通用类型用于成员函数的代码中
   return m_a + a
}
  T2 getb0) // 获取成员m b的值
  {
 T2 b = 1;// 通用类型用于成员函数的代码中
  return m_b + b
}
}

int main()

{
  AA<int, double> a; // 用模板类AA创建对象

  a.m_a = 20;

  a.m_b = 30;

  cout << "a.geta()=" << a.geta() << endl;

  cout << "a.getb()=" << a.getb() << endl;

}

类模板注意事项

1)在创建对象的时候,必须指明具体的数据类型。
//例AA<int, double> a; 中括号里不能为空
2)使用类模板时,数据类型必须适应类模板中的代码。 3)类模板可以为通用数据类型指定缺省的数据类型(C+ +11标准的函数模板也可以)。
//例:
template <class T1,class T2 = string>指定后main函数里可以写成A<int> a;
4)类的成员函数可以在类外实现。实现语法如下:

  template <class T1, class T2>
  T2 AA<T1,T2>::getb()
  {return m_b;}

5)可以用new创建模板对象。语法如下

  AA<int, string>* a = new AA<int, string>(3, "西施"); // 用模板类AA创建对象a。

6)在程序中,模板类的成员函数使用了才会创建。

 

 

posted @ 2023-09-02 18:21  ddup123  阅读(25)  评论(0)    收藏  举报