当前位置: 首页 > 编程笔记 >

C++中的模板template小结

关苗宣
2023-03-14
本文向大家介绍C++中的模板template小结,包括了C++中的模板template小结的使用技巧和注意事项,需要的朋友参考一下

函数模板

我们可以把函数模板当做一种特殊的函数,里面的参数类型可以是任意类型,这样的话我们就可以减少重复定义,从而让这个函数模板自动适应不同的参数类型,也就是说函数可以适应多种类型的参数,例如double、int或者类什么的。

C++为了实现上面的功能,引入了template这个概念。我们可以把template当成是一种特殊的类型参数,并且也可以在函数里当做参数传递,心里面把它当做int什么的就行了。

使用类型参数声明函数模板的格式如下所示:

template <class identifier> function_declaration;
template <typename identifier> function_declaration; 
 // 这里使用了typename 当做声明类型参数

上面声明函数模板的格式只有一处不同,那就是class和typename,在这里其实使用哪一种都没有区别,看自己喜欢就行,C++对此也没有做严格的区分;

为了更好的说明如何使用函数模板,便在举一个很形象的例子,那就是一个用来返回较大值的函数,具体写法如下所示:

template <typename T>
T GetMax(T a, T b)
 return a > b ? a : b;

在上面的短短几行代码中我们就创建了一个函数模板用来获取两个数之间较大的那个数,不难看出T在这里并没有指明具体的类型,在这我们仍然可以在心里把它当做普通变量处理,返回值也是T。

为了使用我们定义的函数模板,可以参照统一的函数模板调用格式

function_name<type> (parameters); 
// type就是具体的类型,例如int、double这些,parameters就是函数里的参数,也是具体类型

所以,如果我们想要实现获取两个整形值里较大的那个,我们可以传入int这个类型之后调用GetMax函数,具体示例如下:

int x = 4;
int y = 2;

int max = GetMax<int> (x, y); // max = 4

类模板

由于template声明的类型可以是任意类型,也就是使用的时候传入具体的类型就行。所以可以参考上面函数模板的例子构造类模板也是一样的,在使用这个类的时候传入具体的变量类型就行了。例如下面的类模板定义:

template <typename T>
class MyPair{
 T value[2];
 
 public:
  MyPair(T first, T second)
  {
   value[0] = first;
   value[1] = second;
  }
 };

类模板的示例代码中定义一个MyPair类,用来存储任意类型的两个元素,例如double,char,int等,下面我就给出两个示例,分别存储double和int类型的变量

MyPair<int> myInt(2, 3); // 存储两个整型值
MyPair<double> myDouble(2.3, 3.43); // 存储两个double值

模板类的成员函数也可以在类外定义,写法和函数模板的写法是一样的,具体示例如下所示:

template <class T>
class MyPair {
 T a, b;
 public:
 mypair (T first, T second)
  {a=first; b=second;}
 T Getmax ();
};

template <typename T>
T MyPair<T>::Getmax () // 在类外定义函数, 注意前面的写法和函数模板写法一致
{
 T retval;
 retval = a>b? a : b;
 return retval;
}

模板特化

如果我们想要为类模板定义一个不同的实现接口,并且要求需要将特定参数作为参数传递时,那么我们就可以将该模板特化

为了更好地说明模板特化,还是举个简单的例子吧。假设我们定义一个类mycontainer,这个类可以存储一个任意类型的变量,并且这个类还有一个函数叫做increasement用来将存储的类型加一。并且,如果这个类存储的是一个char类型的时候,我们会发现这个类对于实现将其中的成员变量转换为大写的功能将更加方便,不妨将这个函数定义为ToUpper,因此,我们可以为char类型的类模板实现模板特化,具体的示例代码如下:

// 模板特化
#include <iostream>
using namespace std;

// 声明类模板:
template <typename T>
class mycontainer {
 T element;
 public:
 mycontainer (T arg) {element=arg;}
 T increase () {return ++element;}
};

// char类型的模板特化:
template <>
class mycontainer<char> {
 char element;
 public:
 mycontainer(char arg) {element=arg;}
 
 char ToUpper()
 {
  if ((element>='a')&&(element<='z'))
  element+='A'-'a';
  return element;
 }
};

对于上面的模板特化,我们需要几点,注意类模板和模板特化的区别和联系

  • 在类模板的前面加上template <>,这表明是模板特化,也就是是说模板特化都需要加上这句话;
  • 还有一点就是类模板后面使用了<char>参数,这个特定参数表示我们将模板类特化程<char>类型;

template的其他用法

除了以template或者class关键字开头声明的表示类型的模板参数之外,template也可以具有其他类型的参数,例如int、double这些参数,就类似于一个函数中拥有多个参数,每个参数类型还不一样。为了更好的说明template的其他用法,不妨参考下面的示例代码,

#include <iostream>
using namespace std;

template<class T, int N> // 这里除了含有class声明的类型之外,还拥有一个int类型
class mysequence {
 T memblock [N];
 public:
 void setmember(int x, T value);
 T getmember(int x);
};

template<class T, int N>
void mysequence<T,N>::setmember(int x, T value) {
 memblock[x]=value;
}

template<class T, int N>
T mysequence<T,N>::getmember(int x) {
 return memblock[x];
}

int main(){
 mysequence<int,5> myints;
 mysequence<double,5> myfloats;
 myints.setmember(0,100);
 myfloats.setmember(3,3.1416);
 cout << myints.getmember(0) << '\n';
 cout << myfloats.getmember(3) << '\n';
 return 0;
}

总结

到此这篇关于C++总结之template的文章就介绍到这了,更多相关C++总结之template内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍C++模板template用法小结(推荐),包括了C++模板template用法小结(推荐)的使用技巧和注意事项,需要的朋友参考一下 引言 模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。 函数模板 在c++入门中,很多人会接触swap(int&,

  • 在模板模式中,抽象类公开定义的方式/模板以执行其方法。 它的子类可以根据需要覆盖方法实现,但调用的方式与抽象类的定义相同。 此模式属于行为模式类别。 实现 (Implementation) 我们将创建一个Game抽象类,定义操作,模板方法设置为final,以便不能覆盖它。 Cricket和Football是扩展Game并覆盖其方法的具体类。 我们的演示类TemplatePatternDemo将使用

  •  说明 调用方法: $.f2e.util.render(temp,data,fn,helper); 函数说明: 调用template渲染模板,依赖于artTemplate库 参数说明: 参数名 类型 说明 备注 temp string html字符串 无 data object 参数名 无 fn function 回调函数 无 helper function artTemplate自定义方法 无

  • voidsmarty_function_name(array $params, object &$smarty) All attributes passed to template functions from the template are contained in the$params as an associative array. Either access those values d

  • 在本章中,我们将研究如何在Joomla中create a template 。 创建模板 以下是在Joomla中创建模板的简单步骤 - Step (1) - 在Joomla → Templates文件夹中创建一个名为MyFirstTemplate文件夹。 在MyFirstTemplate文件夹中,再创建2个名为images和CSS的文件夹,以保存所有图像和CSS文件。 Step (2) −在MyF

  • 在本章中,我们将研究如何在Joomla中add/install Template 。 添加模板 以下是在Joomla中添加/安装模板的简单步骤。 Step (1) - 单击Extensions → Extension Manager ,如下所示。 Step (2) - 单击Extension Manager ,您将看到以下屏幕。 您可以在此处从Web , package , Directory或U