c++入门----模板

简介: 笔记

一.为什么要定义模板


当我们定义一个加法函数的时候,可能存在以下几种情况,int+int,int+float,flaot+float等等情况,这时候就需要我们定义多个操作相同的加法函数,这样显然是非常繁琐也是没有必要的。

模板的引入就是为了解决这一问题。该编程方式称为“泛型编程”,它的引入大大简化了程序的代码量,保持了结构的清晰,提高的程序设计的效率。


二. 函数模板的定义


定义如下:

template<模板参数表>
放回类型 函数名(参数列表)
{
  函数体
}

关键字template放在模板的定义前面,模板参数表不能为空。class或typename 修饰的类型参数代表一种类型,非类型参数由已知类型符,代表一个常量表达式。

template<class Any,class Another,int number>
double fun(Any a,int b, Another c)
{
}


三.函数模板的使用


隐式实例化,下面模板的参数类型直到该函数真正被调用的时候才被决定。

#include<iostream>
using namespace std;
template<class Ex>
Ex Greater(Ex x, Ex y);
int main(void)
{
  int intX=1,intY=2;
  double dblx = 3.0, dbly = 2.5;
  cout<<Greater(intX,intY)<<endl;
  cout<<Greater(dblx,dbly)<<endl;
  return 0;
}
template<class Ex>
Ex Greater(Ex x, Ex y)
{
  return x>y?x:y;
}

2.显式实例化,每个模板函数只能被显式实例化一次,否则会出现重定义。

#include<iostream>
using namespace std;
template<class Ex>
Ex Greater(Ex x, Ex y);
template int Greater<int> (int ,int );  #显式实例化函数模板
int main(void)
{
  int intX=1,intY=2;
  double dblx = 3.0, dbly = 2.5;
  cout<<Greater(intX,intY)<<endl;
  cout<<Greater(dblx,dbly)<<endl;
  return 0;
}
template<class Ex>
Ex Greater(Ex x, Ex y)
{
  return x>y?x:y;
}

3.特化,c++引入了特化来解决某些类型在函数中的特殊操作,当编译器寻找到与函数调用的特化时,先使用特化的定义,不在使用模板函数,其定义的基本概述如下

template<> 返回类型 函数名 [<类型实参表>](函数参数表)
{
}

例子

#include<iostream>
using namespace std;
template<class Ex>
Ex Greater(Ex x, Ex y);
template<> double Greater<double>(double,double);  #特化声明
int main(void)
{
  int intX=1,intY=2;
  double dblx = 3.0, dbly = 2.5;
  cout<<Greater(intX,intY)<<endl;
  cout<<Greater(dblx,dbly)<<endl;
  return 0;
}
template<class Ex>
Ex Greater(Ex x, Ex y)
{
  return x>y?x:y;
}
template<> double Greater(double x , double y)
{
  return x+y;
}

4.重载,函数模板支持重载,既可以在模板之间重载,又可以在模板和普通函数间重载,但模板函数的重载相比普通函数的重载要复杂一些。重载的普通函数如下

char* Greater(char* x, char * y)
{
  return (strcmp(x,y)>0?x:y);
}


公众号:FPGA之旅

目录
相关文章
|
27天前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
42 4
|
27天前
|
算法 编译器 C++
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
34 3
|
2月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
47 2
C++入门12——详解多态1
|
1月前
|
编译器 C++
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
31 0
|
2月前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
18 1
|
2月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
87 1
|
2月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
28 0
|
2月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
37 0
|
2月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
2月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)