首页 > 编程语言 >C++中模板的初级使用函数模板(刚刚接触模板概念的小白也能明白)

C++中模板的初级使用函数模板(刚刚接触模板概念的小白也能明白)

时间:2024-09-22 19:50:55浏览次数:12  
标签:Box right 函数 C++ 小白 template 类型 模板

文章目录

模板分类

模板的核心思想是让编译器在编译时生成适用于具体类型的代码,这个过程称为模板实例化。C++ 中的模板分为两种:函数模板和类模板。
在这里插入图片描述
本文对于模板的讲解仅包含模板中函数模板的部分,即初阶讲解类模板仅包含一小部分提供一些示例

函数模板

  1. 泛型编程
    如何实现一个通用的交换函数呢?
    接下来我们通过我们常见的一个简单函数进行引入:
void Swap(int& left, int& right)
 {
 int temp = left;
 left = right;
 right = temp;
 }
 void Swap(double& left, double& right)
 {
 double temp = left;
 left = right;
 right = temp;
 }
 void Swap(char& left, char& right)
 {
 char temp = left;
 left = right;
 right = temp;
 }
 ......

使用函数重载虽然可以实现,但是有一下几个不好的地方:

  1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数
  2. 代码的可维护性比较低,一个出错可能所有的重载均出错那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

这是我们经常写的两个值交换函数,但是在我们交换不同类型数据的时候,我们就需要对这个交换函数再进行一份书写,这样就会显得整个代码程序写的非常冗余,所以在C++当中,引出了模板的这个概念

在 C++ 中,函数模板是一种可以编写泛型代码的机制。它允许你编写一个函数,而不需要预先定义具体的数据类型。函数模板可以用于处理不同类型的参数,而不需要为每个类型编写不同的函数。通过函数模板,C++ 提供了一种类型无关的编程方法。

函数模板的原理

在这里插入图片描述
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

函数模板基本语法 —— typename 以及 class

template <typename T>
返回类型 函数名(参数列表) {
    // 函数体
}

template <classs T>
返回类型 函数名(参数列表) {
    // 函数体
}

在模板参数列表中,class 和 typename 是等价的,可以互换使用。

简单的函数模板

示例:

#include <iostream>
using namespace std;

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

int main() {
    cout << add(3, 4) << endl;        // 整数相加,输出 7
    cout << add(3.5, 4.2) << endl;    // 浮点数相加,输出 7.7
    return 0;
}

在这个例子中,add 函数是一个模板函数,它接受两个类型相同的参数,并返回它们的和。模板参数 T 使得这个函数能够同时处理 int、double 等多种类型。

#include <iostream>
using namespace std;

template <class T>
T max_value(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    cout << max_value(10, 20) << endl;         // 整数比较,输出 20
    cout << max_value(3.14, 2.71) << endl;     // 浮点数比较,输出 3.14
    return 0;
}

在这个例子中,模板参数 T 可以是任何类型,当我们调用 max_value 时,C++ 编译器会根据传递的参数自动推导 T 的类型。这个函数模板可以处理整数、浮点数等不同类型。

多类型模板参数

函数模板可以包含多个模板参数,允许不同类型的输入。例如:

#include <iostream>
using namespace std;

template <typename T1, typename T2>
auto multiply(T1 a, T2 b) -> decltype(a * b) {
    return a * b;
}

int main() {
    cout << multiply(10, 2.5) << endl; // 整数和浮点数相乘,输出 25.0
    return 0;
}
#include <iostream>
using namespace std;

template <class T1, class T2>
auto add(T1 a, T2 b) -> decltype(a + b) {
    return a + b;
}

int main() {
    cout << add(10, 2.5) << endl;       // 整数和浮点数相加,输出 12.5
    cout << add(100L, 200) << endl;     // 长整型和整型相加,输出 300
    return 0;
}

class 和 typename 的选择

如果你是在模板参数列表中声明类型参数,你可以自由选择 class 或 typename,两者没有任何功能上的区别。

template <class T>
void func(T a) {}

template <typename T>
void func(T a) {}

类模板

除了函数模板,C++ 还支持类模板,使类可以处理不同的数据类型。下面是一个简单的类模板的例子,它实现了一个通用的容器类 Box,可以存储任何类型的数据。

格式:

template<class T1, class T2, ..., class Tn> 
class 类模板名
{
 // 类内成员定义
};   

示例

#include <iostream>
using namespace std;

template <class T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}
    void display() const {
        cout << "Box contains: " << value << endl;
    }
};

int main() {
    Box<int> intBox(123);           // 创建存储整数的 Box
    Box<double> doubleBox(3.14);    // 创建存储浮点数的 Box
    Box<string> stringBox("Hello"); // 创建存储字符串的 Box

    intBox.display();      // 输出: Box contains: 123
    doubleBox.display();   // 输出: Box contains: 3.14
    stringBox.display();   // 输出: Box contains: Hello

    return 0;
}

在这个类模板中,class T 表示模板参数 T,可以是任何类型。我们可以创建不同类型的 Box 对象,比如 int, double, 或 string,每个 Box 对象会存储相应类型的数据。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1jgs8bs9kwrkm

标签:Box,right,函数,C++,小白,template,类型,模板
From: https://blog.csdn.net/ZWW_zhangww/article/details/142373915

相关文章

  • C/C++中内存管理
    这里写目录标题C语言中动态内存管理方式:malloc/calloc/realloc/freeC++内存管理方式operatornew与operatordelete函数operatornewoperatordeletenew和delete的实现原理malloc/free和new/delete的区别C语言中动态内存管理方式:malloc/calloc/realloc/free在C语言......
  • C++从入门到起飞之——多态 全方位剖析!
    ......
  • C++ 元编程
    目录C++元编程1.术语2.元函数1.数值元函数示例:阶乘计算2.类型元函数示例:类型选择3.混合编程1.常规的计算点积范例2.混合元编程计算点积4.typelist实现设计和基本操作接口(算法)完整代码5.tuple实现基础知识1.左值、右值、左值引用、右值引用2.std::move......
  • 【C++基础知识——std::visit函数理解】
    1.std::visit函数的定义std::visit通常用于访问std::variant类型的对象。std::variant是C++17引入的一种类型安全的联合体,可以存储多个类型中的一个。visit函数允许你通过一个访问者(visitor)来访问std::variant中存储的值,而不需要显式地检查存储的类型。2.示例#......
  • C++类和对象(中),重点之重点,类和对象的掌握就看这一节了!
    [前言] 类中有六大默认成员函数,默认成员函数就是用户不显示实现,编译器也会自动生成的成员函数。目录[前言] 一、构造函数二、析构函数三、拷贝构造函数四、赋值运算符重载五、取地址运算符重载一、构造函数构造函数虽然叫构造,但是它并不是开空间创建对象,而是在对......
  • 【C++】二叉搜索树的底层以及实现
    个人主页文章目录⭐一、二叉搜索树的概念......
  • C++速通LeetCode中等第10题-轮转数组(四种方法)
    方法一:巧用deque双向队列容器classSolution{public:voidrotate(vector<int>&nums,intk){deque<int>q;inttmp;if(nums.size()>1){for(autonum:nums)q.push_back(num);......
  • 帝国模板登录出现已被登录或者密码错误解决方法
    当帝国CMS(EmpireCMS)后台登录时出现“已被登录”或“密码错误”的提示,这可能是由多种原因造成的。以下是一些可能的解决方法:密码错误确认密码确认输入的密码是否正确。注意区分大小写,以及是否有空格等。重置密码如果忘记了密码,可以通过直接访问数据库来重置密码。使用......
  • MySQL 用户、权限管理,C/C++连接与使用
    目录用户用户管理查询所有用户查看当前用户查看当前连接数创建用户删除用户修改密码规则查看规则/策略规则说明临时设置持久设置修改密码权限数据库提供的权限列表查看权限给用户授权回收用户权限使用C语言连接库的安装CAPImysql_initmysql_real_connectmysql_closemysql_querym......
  • C++自助洗衣店-计算机毕业设计源码35120
    目 录摘要1绪论1.1选题背景与意义1.2研究现状1.3论文结构与章节安排2 自助洗衣店管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3操作可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系......