首页 > 编程语言 >C++函数模板的重载

C++函数模板的重载

时间:2024-03-14 20:48:55浏览次数:22  
标签:temp int void C++ Swap template 重载 模板

C++模板

当需要对不同的类型使用同一种算法(同一个函数体)时,为了避免定义多个功能重复的函数,可以使用模板。然而,并非所有的类型都使用同一种算法,有些特定的类型需要单独处理,为了满足这种需求,C++ 允许对函数模板进行重载,程序员可以像重载常规函数那样重载模板定义。

我们定义了 Swap() 函数用来交换两个变量的值,一种方案是使用指针,另外一种方案是使用引用

//方案①:使用指针
template<typename T> void Swap(T *a, T *b){
    T temp = *a;
    *a = *b;
    *b = temp;
}
//方案②:使用引用
template<class T> void Swap(T &a, T &b){
    T temp = a;
    a = b;
    b = temp;
}

这两种方案都可以交换 int、float、char、bool 等基本类型变量的值,但是却不能交换两个数组。

交换两个数组唯一的办法就是逐个交换所有的数组元素

template<typename T> void Swap(T a[], T b[], int len){
    T temp;
    for(int i=0; i<len; i++){
        temp = a[i];
        a[i] = b[i];
        b[i] = temp;
    }
}

在该函数模板中,最后一个参数的类型为具体类型(int),而不是泛型。并不是所有的模板参数都必须被泛型化。

完整代码

#include <iostream>
using namespace std;

template<class T> void Swap(T &a, T &b);  //模板①:交换基本类型的值
template<typename T> void Swap(T a[], T b[], int len);  //模板②:交换两个数组
void printArray(int arr[], int len);  //打印数组元素

int main(){
    //交换基本类型的值
    int m = 10, n = 99;
    Swap(m, n);  //匹配模板①
    cout<<m<<", "<<n<<endl;
    //交换两个数组
    int a[5] = { 1, 2, 3, 4, 5 };
    int b[5] = { 10, 20, 30, 40, 50 };
    int len = sizeof(a) / sizeof(int);  //数组长度
    Swap(a, b, len);  //匹配模板②
    printArray(a, len);
    printArray(b, len);

    return 0;
}

template<class T> void Swap(T &a, T &b){
    T temp = a;
    a = b;
    b = temp;
}

template<typename T> void Swap(T a[], T b[], int len){
    T temp;
    for(int i=0; i<len; i++){
        temp = a[i];
        a[i] = b[i];
        b[i] = temp;
    }
}

void printArray(int arr[], int len){
    for(int i=0; i<len; i++){
        if(i == len-1){
            cout<<arr[i]<<endl;
        }
        else{
            cout<<arr[i]<<", ";
        }
    }
}

结果

99, 10
10, 20, 30, 40, 50
1, 2, 3, 4, 5

 

标签:temp,int,void,C++,Swap,template,重载,模板
From: https://www.cnblogs.com/uacs2024/p/18073889

相关文章

  • C++ error C2143: 语法错误: 缺少“;”(在“*”的前面)
    errorC2143编译错误但是,我在官网的例子上没有找到我所遇见的问题!在此记录一下,问题代码如下:1classtestA1;2classworkclass3{4public:5explicitworkclass();6virtual~workclass();7private:8intM_INT;9......
  • c++面试必问20题
    引用为什么不能修改引用关系?什么是重载this指针如何在类中出现的?类中的函数存放在代码区,所有对象访问的成员函数都是同一份代码,当不同对象调用同一个成员函数时,通过this区分在成员函数内修改的是哪个对象的成员变量this指针是否可以修改?不可以,如果修改了this就无法在函数......
  • C++动态数组
    #include<iostream>usingnamespacestd;intmain(){ intt,i=0,j=0; cin>>t; char*pc=nullptr;//初始化 int*pi=nullptr;//初始化 float*pf=nullptr;//初始化 intsum=0; intFLAG=0; while(FLAG<t) { charch; cin>>......
  • 04_C++字符串_迭代器使用
    概念:迭代器是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器内元素的访问,但不同的容器有不同的迭代器,初学者可以将迭代器理解为指针。1.使用迭代器使用begin和end,begin成员负责返回第一个元素(或者第一个字符)的迭代器。end成员返回指向容器“尾元素的下一个位置......
  • C++文件输入输出
    前置工作引入#include<fstream>才可以使用输入输出流读文件#include<fstream>#include<iostream>usingnamespacestd;intmain(){ chardata[100]; //读取 ifstreamfin; fin.open("data.txt"); fin.getline(data,100); //读取一行 cout<<data&l......
  • C++、Java 和 Go 是三种流行的编程语言,它们各有不同的特点和应用场景
    C++:面向对象和泛型编程:C++是一种多范式编程语言,支持面向对象编程(OOP)和泛型编程(GenericProgramming)。性能:C++是一种系统级编程语言,注重性能和内存管理。它提供了直接的内存访问和指针操作,使得程序员可以更精细地控制内存和计算资源。灵活性:C++允许程序员直接操作硬件,并提......
  • 滑动窗口模板
    /*滑动窗口算法框架*/voidslidingWindow(Strings){//用合适的数据结构记录窗口中的数据HashMap<Character,Integer>window=newHashMap<>();intleft=0,right=0;while(right<s.length()){//c是将移入窗口的字符char......
  • ros2中Qos的C++配置方法
    1.dds_debug.hpp#ifndefDDS_DEBUG__DDS_DEBUG_HPP_#defineDDS_DEBUG__DDS_DEBUG_HPP_#include<rclcpp/rclcpp.hpp>#include<rclcpp/qos.hpp>#include<rmw/types.h>#include<sensor_msgs/msg/imu.hpp>constrmw_qos_profile_tmy_cus......
  • 2024-03 STEMA 考试C++ 中级真题解析
    2024-03-10STEMA考试C++中级真题解析一、选择题(50分)1、    (110010)2+(c3)16的结果是(B )。A.(240)10        B.(11110101)2        C.(366)8        D.(f6)16备注:此题目下标代表进制,因不支持md格式。  2、   表达式1000/3的结果是(......
  • 模板匹配——determine_shape_model_params
    determine_shape_model_params—Determinetheparametersofashapemodel.模版匹配参数确定 determine_shape_model_paramsdeterminescertainparametersofashapemodelautomaticallyfromthemodelimageTemplate.Theparameterstobedeterminedcanbesp......