首页 > 编程语言 >C++中的模板

C++中的模板

时间:2023-07-26 22:45:19浏览次数:46  
标签:函数 void elem C++ add template 模板

1. 概念

模板是对类型的抽象,为了更好的实现多态的思想。

模板分为类模板和函数模板。

2. 函数模板

就是在函数之前声明一下模板,然后执行的时候,函数自行判断推导类型。

int add(int a, int b) {
    return a + b;
}

double add(double a, double b){
    return a + b;
}
// 如 add函数,要写多个版本

现在使用模板,只要一个函数模板就可以。

template <typename T>
T add(T a, T b){
	return a + b;
}

// template 是模板声明的关键字。
// typename 是为了定义类型参数,也可以用 class。
// T 是参数类型,名字不重要。

当执行 add 时,会根据参数,自行判断类型。

3. 显式实例化和隐式实例化

显式就是说明是什么类型,隐式就是让其自行推导。

add<int>(5, 9); //显式
add(5, 9); //隐式

我声明的这个是函数模板,在执行的时候,编译期就会被实例化为一个函数,也就是模板函数。

函数模板 -------> 经过参数推导,实例化为 ------> 模板函数。

4. 特化

函数模板可以和模板函数共存,发生重载。

函数模板之间也可以发生重载。

template <typename T>
T add(T a, T b) {
    cout << "T add(T, T)" << endl;
    return a + b;
}

int add(int a, int b) {
    cout << "int add(int, int)" << endl;
    return a + b;
}
// 这种情况下,如果 add(5, 9) 运行,调用的是 int add(int, int) 的版本。

因为函数模板要推导成模板函数,现在已经有了模板函数,就直接调用模板函数了。

也就是说,模板函数优先级高于函数模板。 模板函数 > 函数模板。

但,怎么知道这是一个模板函数?表示它是函数模板的一个特例?

// 前面加上一个 template <> 表示它是函数模板的一个特化版本即可。
template <>
int add(int a, int b) {
    cout << "int add(int, int)" << endl;
    return a + b;
}

5. 非类型参数

模板中存在一种非类型参数。可以当作形参使用。

  template <typename T, int num = 10> 
  T mul(T elem) {
      return elem * num;
  }
 // 此中的 num 就是一个非类型参数。注意,非类型参数只能是整型。   double, float 不行。

6. 可变参数

类型可以声明多个,参数也可以声明多个。

如:

  // 多个类型 和 形参
  template <typename T1, typename T2, typename T3> 
  void demo(T1 t1, T2 t2, T3 t3) {
      cout << t1 << " " << t2 << " " << t3 << endl;
  }

可以使用模板的可变类型参数。

template <typename ...T>
void demo(T ...elem){
//    输出 所有elem 的值可以利用递归print()
    print(elem...);
}

template <typename T, typename ...Arg>
void print(T e, Arg ...args){
    cout << e << " ";
    print(args...);
}

void print(){
    return;
}

... 在前为打包,

... 在后为解包。

7. 类模板

类模板就是在类上声明的模板。

注意,类外定义的成员要带上模板

template <typename T>
class Example {
public: 
    void p();
};        

template <typename T>
void Example<T>::p() {
    cout << endl; 
}     

代码:

#include <iostream>
using namespace std;

template <typename T>
T add(T a, T b) {
    cout << "T add(T, T)" << endl;
    return a + b;
}

int add(int a, int b) {
    cout << "int add(int, int)" << endl;
    return a + b;
}

template <typename T, int num = 10>
T mul(T elem) {
    return elem * num;
}

// 多个类型 和 形参
template <typename T1, typename T2, typename T3>
void print(T1 t1, T2 t2, T3 t3) {
    cout << t1 << " " << t2 << " " << t3 << endl;
}

template <typename T, typename... Arg>
void print(T e, Arg... args) {
    cout << e << " ";
    print(args...);
}

void print() {
    return;
}

template <typename... T>
void demo(T... elem) {
    // 输出 所有elem 的值可以利用递归print()
    print(elem...);
}

template <typename T>
class Example {
public:
    void p();
};

template <typename T>
void Example<T>::p() {
    cout << endl;
}

void test0() {
    demo(1, 2, 3, 4, 5, 9);
}

int main(int argc, char* argv[]) {
    test0();
    return 0;
}

标签:函数,void,elem,C++,add,template,模板
From: https://www.cnblogs.com/zxinlog/p/17583710.html

相关文章

  • vue指令及模板语法
    说实话,看了这两节之后,改变认知的,突然发现自己落后了这么多,真不应该v- 这个指令集的确666,把许多东西的实现简化了,真心学到了不少,菜鸟这方面讲的真是不错https://www.runoob.com/vue3/vue3-directives.html我在这就不献丑了,而且里面的各种试例的可运行代码环境我非常喜欢,可以......
  • c++ std::thread::joinable
    std:......
  • c++
    /*#include<iostream>usingnamespacestd;intmain(){intn; intb; intc=0;cin>>n;inta[n];for(inti=0;i<n;i++){cin>>a[i];}for(inti=0;i<n;i++){for(intj=0;j<n-i-1;j++){......
  • c++学习:封装、继承、多态
    c++是面向对象的编程语言,相对于c具有封装、继承、多态的特点。封装定义:封装就是将对象的属性和行为封装起来,形成一个有机的整体,其载体就是类。类通常对客户隐藏其实现细节,这就是封装的思想,就比如我们使用一个库函数时,我们只需要知道它的作用就可以了,没必要去了解它的内部工......
  • 小熊猫 C++ 的 Monokai 改进
    小熊猫目前自带的配色方案Monokai:发现很丑,根本不是想象中的Monokai!!!网上也没有相关的配置,于是自己花了一下午弄了个Monokai:下载地址解压后直接在配色里面导入即可。具体步骤:工具-选项-编辑器配色-导入配色-选中解压后的文件-确定。是不是好看多了?还支持自定义......
  • c++学习:程字辈(进程、线程、协程)
    程字辈(进程、线程、协程)介绍C++中的进程、线程、协程之间的联系及区别。(以linux下实现为例)进程概念:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来......
  • C/C++代码混淆器
    C/C++代码混淆器试图通过混淆C/C++源代码以达到保护知识产权的目的的做法其实就是自欺欺人,因为不论如何混淆代码,到了编译阶段代码终究是要被还原成它本来的样子,说到底,这只是一层窗户纸而已。我曾利用宏机制实现过一个C/C++代码混淆器,效果乍一看还真能给人一种眼前一亮的神奇,......
  • C#引用c++ DLL找不到入口点
    c++中的函数名称在编译后改变了,需要利用dumpbin.exe找到编译后的名字dumpbin.exe在VS安装目录参考路径:C:\ProgramFiles(x86)\MicrosoftVisualStudio\2019\Community\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64打开cmd,移动到dumpbin.exe对应路径,然后输入命令dumpbin-e......
  • 仿奈雪の茶小程序,奶茶小程序模板源码(附全套源码下载链接)
    分享一个仿奈雪の茶小程序,奶茶小程序模板源码(兼容H5版本全网首发)完美复刻奈雪の茶小程序,可稍加修改使用。代码结构如下本项目包含:首页点餐(自取和外卖两种方式,有基本的点餐逻辑处理)取餐我的积分商城积分商城详情页积分签到会员码我的卡券收货地址我的资料我的订......
  • C++使用指针进行地址传递及错误示范
    正确示范:voidchange(int*a,int*b){ inttemp=*a; *a=*b; *b=temp;}错误示范:voidchange(int*a,int*b){ int*temp=a; a=b; b=temp;} ......