模板初阶(2):函数模板的匹配原则,类模板的实例化

简介: 模板初阶(2):函数模板的匹配原则,类模板的实例化

一、函数模板的匹配原则

int Add(const int& x, const int& y)
{
  return x + y;
}

template <class T>
T Add(const T& x, const T& y)
{
  return x + y;
}

int main()
{
  int a1 = 1, a2 = 2;
  Add(a1, a2);

  double d1 = 1.1, d2 = 2.2;
  Add(d1, d2);

  return 0;
}
  • 一个非模板函数可以和同名的函数模板同时存在。
  • 匹配原则:
  1. 匹配合适的情况下,编译器会优先调用非模板函数,而非通过模板实例化出一个新的函数。
  2. 如果模板能实例化出匹配更好的函数,则优先模板
  3. 普通函数支持隐式类型转换。


二、类模板的实例化

template <class T>
class Stack
{
public:
  Stack(int n = 4)
    :_top(0)
    ,_capacity(n)
  {
    cout << "Stack(int n = 4)" << endl;
    _a = new T[n];
  }

  ~Stack()
  {
    cout << "~Stack()" << endl;
    delete _a;
    _a = nullptr;
    _top = _capacity = 0;
  }

private:
  T* _a;
  int _top;
  int _capacity;
};


int main()
{
  Stack <int> s1;    // 1. 类名 <数据类型> 才是实例化类的类型
  Stack <double> s2; // 2. 显式实例化的类型不同,它们就是不同的类

  return 0;
}
相关文章
|
8月前
|
安全 编译器 程序员
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用(一)
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用
110 1
|
7月前
|
编译器
模板初阶(1):函数模板,类模板
模板初阶(1):函数模板,类模板
|
存储 算法 安全
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
|
8月前
|
算法 搜索推荐 编译器
【C/C++ 编程题 04】实现 模板函数和模板类的特例化,并且展示差异化的点
【C/C++ 编程题 04】实现 模板函数和模板类的特例化,并且展示差异化的点
68 0
|
8月前
|
自然语言处理 安全 程序员
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用(二)
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用
98 0
|
编译器 C++
C++模板(函数模板,类模板)的基本使用与非类型模板参数与模板的特化(2)
C++模板(函数模板,类模板)的基本使用与非类型模板参数与模板的特化
144 0
|
编译器 C++
C++模板(函数模板,类模板)的基本使用与非类型模板参数与模板的特化(1)
我们先来思考一个问题,如果有人让你实现一个通用的交换函数你们会怎么做?有的小伙伴会说,我会使用函数重载的方式,把每一种类型重载,但…难道就没有更容易的办法,不用敲那么多次吗?ok,就来看看我们今天要介绍的模板,能很好的帮你解决这个问题。
184 0
|
编译器 C语言 C++
【C++入门必备知识:缺省参数+函数重载+函数名修饰规则】
当调用该函数时,如何没有没有指定实参则采用改形参的默认值。
142 0
|
算法 编译器 C++
C++学习笔记(九)——模板初阶(泛型编程基础,函数模板,类模板)
C++学习笔记(九)——模板初阶(泛型编程基础,函数模板,类模板)
C++学习笔记(九)——模板初阶(泛型编程基础,函数模板,类模板)