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

C++ 函数模板

时间:2024-03-20 22:59:41浏览次数:26  
标签:函数 int C++ 编译器 参数 类型 模板

C++ 函数模板

函数模板

在C++中,函数模板是一种允许函数以一种类型无关的方式来操作的工具。它们使得函数能够处理不同类型的数据而不需要为每种类型编写重复的代码。函数模板的核心思想是“参数化类型”,这意味着在定义函数时,可以使用一个或多个通用类型参数,而在函数被调用时,编译器会根据传入的实际参数类型来实例化一个具体的函数版本。

基本语法

函数模板的声明以关键字template开头,后跟模板参数列表,模板参数被封装在尖括号< >内。模板参数通常是类型参数,使用关键字typenameclass声明。

template <typename T>
T functionName(T parameter) {
    // 函数体
}

这里,T是一个类型占位符,代表任何数据类型。当函数被调用时,T将被实际传入的参数类型所替代。

函数模板的实例化

当函数模板被调用时,编译器自动根据传入的参数类型生成一个特定版本的函数,这个过程称为模板实例化。实例化可以是显式的,也可以是隐式的:

  • 显式实例化:在函数调用时,开发者显式指定模板参数的类型。

    functionName<int>(5); // 显式指定T为int类型
    
  • 隐式实例化:编译器根据传入的参数自动推断模板参数的类型。

    functionName(5); // 编译器自动推断T为int类型
    

函数模板的好处

  1. 类型安全:函数模板通过在编译时进行类型检查,提供了类型安全性。这意味着如果代码试图以不兼容的类型使用模板函数,编译器将报错。
  2. 代码复用:通过定义一次模板函数,可以用于多种数据类型,减少了代码的重复。
  3. 灵活性和可扩展性:函数模板提高了代码的灵活性和可扩展性,使得添加对新类型的支持变得更加容易,而不需要修改原有代码。

示例

以下是一个简单的函数模板示例,展示了如何定义和使用一个交换两个变量值的模板函数。

#include <iostream>
using namespace std;

// 定义一个交换两个变量值的函数模板
template <typename T>
void swapValues(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

int main() {
    int i = 10, j = 20;
    cout << "Before swap: i = " << i << ", j = " << j << endl;
    swapValues(i, j); // 隐式实例化为int类型的swapValues
    cout << "After swap: i = " << i << ", j = " << j << endl;

    double x = 10.5, y = 20.5;
    cout << "Before swap: x = " << x << ", y = " << y << endl;
    swapValues(x, y); // 隐式实例化为double类型的swapValues
    cout << "After swap: x = " << x << ", y = " << y << endl;
}

这个例子中的swapValues函数模板可以用于交换任意类型的两个变量的值,无论是整数、浮点数还是其他可以通过值复制的类型。通过使用模板,我们避免了为每种类型编写重复逻辑的需要。

代码示例

#include <iostream> // 包含标准输入输出流库
#include <string>   // 包含string类的定义
using namespace std; // 使用标准命名空间

// 定义一个模板函数add,接受两个同类型的参数x和y,返回它们的和。
// T是一个类型参数,表示函数可以接受任何类型的参数。
template <typename T>
T add(T x, T y) {
    return x + y; // 返回x和y的和。注意这要求T类型支持+操作符。
}

int main() {
    // 显式实例化并调用add函数,指定类型为int。计算5 + 3的结果并打印。
    cout << add<int>(5, 3) << endl;
    
    // 显式实例化并调用add函数,指定类型为double。计算5.3 + 7.8的结果并打印。
    cout << add<double>(5.3, 7.8) << endl;
    
    // 再次显式实例化并调用add函数,指定类型为int。计算4 + 6的结果并打印。
    cout << add<int>(4, 6) << endl;
    
    // 显式实例化并调用add函数,指定类型为string。将字符串"hello"和"world"相加(串联)并打印。
    // 注意:在这个上下文中,+操作符被重载用于连接两个字符串。
    cout << add<string>("hello", "world") << endl;
}

标签:函数,int,C++,编译器,参数,类型,模板
From: https://blog.csdn.net/m0_73640344/article/details/136854927

相关文章

  • qsort实现函数排序(2)
    qsort实现结构体排序#include<stdio.h>#include<stdlib.h>#include<string.h>structstu{ charname[20]; intage;};intcmp_by_name(void*p1,void*p2){ returnstrcmp(((structstu*)p1)->name,((structstu*)p2)->name);}voidprint(s......
  • C++ 编程入门指南:深入了解 C++ 语言及其应用领域
    C++简介什么是C++?C++是一种跨平台的编程语言,可用于创建高性能应用程序。C++是由BjarneStroustrup开发的,作为C语言的扩展。C++为程序员提供了对系统资源和内存的高级控制。该语言在2011年、2014年、2017年和2020年进行了4次重大更新,分别为C++11、C++14、C+......
  • C++ 多重继承下的内存布局
    1.多重继承多重继承示例代码如下:classBase1{public:voidf0(){}virtualvoidf1(){}inta;};classBase2{public:virtualvoidf2(){}intb;};classDerived:publicBase1,publicBase2{public:voidd(){}voidf2(){}......
  • JavaScript 中的函数式编程
    一、问题背景例子下面的代码是一个函数式编程的例子我们先观察一下里面有哪些特殊的语法点,再一一讲解constprogrammerOutput=[{name:'UncleBobby',linesOfCode:500,},{name:'SuzieQ',linesOfCode:1500,},{name:'JimmyGosl......
  • C++ <atomic>汇编语言实现原理
    C++<atomic>汇编语言实现原理问题我们先看一下这段代码:/**badcnt.c-Animproperlysynchronizedcounterprogram*//*$beginbadcnt*//*WARNING:Thiscodeisbuggy!*/#include"csapp.h"void*thread(void*vargp);/*Threadroutineprototype*//*......
  • 六、函数
    本章专题脉络1、函数的基本使用1.1为什么需要函数《街霸》游戏中,每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码,在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将出拳、出脚或跳......
  • 字符串常用函数简易模拟
    strlensize_tMy_strlen(char*str){intcount=0;while(*str){count++;str++;}returncount;}strcpychar*my_strcpy(char*dest,constchar*src){char*ret=dest;//拷贝src指向的字符串到dest指向的空间,......
  • MySQL学习八:窗口函数(一)
    目录一、窗口函数1.窗口函数定义2.窗口函数语法3.演示表格一4.窗口的确定4.1例1:查询各班级总分4.2例2:查询各班级累计总分4.3分区子句(partitionby)4.4排序子句(orderby)4.5窗口子句(rows)4.6总体执行流程5.函数分类5.1排序类函数5.2聚合类函数5.3跨行类函数......
  • C++ 模板入门详解
    目录0.模板引入1.函数模板 1.函数重载的缺点 2.函数模板的概念和格式2. 函数模板的实例化 2.1 隐式实例化:让编译器根据实参推演模板参数的实际类型 2.2 显式实例化:在函数名后的<>中指定模板参数的实际类型2.3函数模板参数的匹配规则 3.类模板 3.1类......
  • C++ 静态变量的初始化线程安全问题
    1.静态变量的初始化线程安全问题C++的局部static变量,是预先在静态存储区分配了内存,然后在第一次执行到这里的时候进行初始化。C++11规定了局部static变量的线程安全,实现上应该是类似std::call_once的实现,我估计基本上就是基于cas的spin-lock,这里当然可以根据编译器不同有不同......