当前位置: 首页 > article >正文

如何使用函数模板和类模板?

函数模板和类模板是泛型编程的重要工具。它们允许你编写与类型无关的代码,从而可以处理多种类型。

函数模板

用于生成多种类型的函数。

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

在这个例子中,add 是一个函数模板,它接受两个同类型的参数并返回它们的和。你可以用不同的类型来实例化这个模板:

#include <iostream>  

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

int main() {  
    std::cout << add(3, 5) << std::endl;         // 输出 8 (int)  
    std::cout << add(3.5, 2.5) << std::endl;   // 输出 6.0 (double)  
    std::cout << add<std::string>("Hello, ", "World!") << std::endl; // 输出 "Hello, World!" (string)  
    return 0;  
}

不通过参数实例化

直接调用 函数名<类型参数列表>(列表参数)

#include <iostream>
using namespace std;
template <class T>
T Inc(T n)
{
    return 1 + n;
}
int main()
{
    cout << Inc<double>(4) / 2; //输出 2.5
    return 0;
}

函数模板的重载

函数模板可以重载,只要它们的形参表或类型参数表不同即可。

template <class T1, class T2>
void print(T1 arg1, T2 arg2)
{
    cout << arg1 << " " << arg2 << endl;
}





template <class T>
void print(T arg1, T arg2)
{
    cout << arg1 << " " << arg2 << endl;
}




template <class T, class T2>
void print(T arg1, T arg2)
{
    cout << arg1 << " " << arg2 << endl;
}

函数模板和函数的次序

再有多个函数和函数模板名字相同的情况下,编译器如下处理一条函数调用语句:(匹配模板函数时,不进行类型自动转换)

1.先找参数完全匹配的普通函数(非由模板实例化而得的函数)。

2.再找参数完全匹配的模板函数。

3.再找实参数经过自动类型转换后能够匹配的普通函数。

类模板

用于定义与类型无关的类。

template <typename T>  
class Container {  
public:  
    Container() : element(T()) {}  
    void set(const T& elem) { element = elem; }  
    T get() const { return element; }  
    
private:  
    T element;  
};

在这个例子中,Container 是一个类模板,可以存储任何类型的元素。你可以用不同的类型来实例化这个类模板:

#include <iostream>  
#include <string>  

template <typename T>  
class Container {  
public:  
    Container() : element(T()) {}  
    void set(const T& elem) { element = elem; }  
    T get() const { return element; }  

private:  
    T element;  
};  

int main() {  
    Container<int> intContainer;  
    intContainer.set(42);  
    std::cout << intContainer.get() << std::endl;  // 输出 42  

    Container<std::string> strContainer;  
    strContainer.set("Hello, Templates!");  
    std::cout << strContainer.get() << std::endl;  // 输出 "Hello, Templates!"  
    
    return 0;  
}

注意事项

模板参数:你可以使用 typename 或 class 来声明模板参数,它们在这个上下文中是等效的。

模板特化:可以提供特定类型的实现,这称为模板特化。例如,你可以对某个特定的类型进行特化:

template <>  
std::string add<std::string>(std::string a, std::string b) {  
    return a + " " + b;  // 对字符串特别处理  
}

非类型模板参数:除了类型类型泛型参数外,你还可以使用非类型参数。

template <typename T, int size>  
class Array {  
public:  
    T& operator[](int index) { return data[index]; }  
private:  
    T data[size];  
};

模板实例化:当编译器遇到使用模板的语句时,它根据提供的参数创建实际的函数或类定义。编译

时间较长:因模板实例化在编译时生成代码,过度使用模板可能导致编译时间增加。


http://www.kler.cn/a/385101.html

相关文章:

  • 盘点2024年惊艳的10款录屏工具!!
  • InnoDB 存储引擎<七>通用表空间+临时表空间
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十. 多线程控制帧率。循环播放,QT connect 细节,
  • Docker-软件容器平台
  • 前端开发实现自定义勾选/自定义样式,可复选,可取消勾选
  • 内部知识库:优化企业培训流程的关键驱动力
  • 拓展题:viple计算n!
  • Docker可视化管理面板DPanel的安装
  • Ubuntu20.04离线安装nginx
  • 服务器作业(2)
  • AWS S3 JavaScript SDK(v3)常用操作
  • ReactPress 是什么?
  • 独立站怎么搭建,英文网站制作
  • Moment.js、Day.js、Miment,日期时间库怎么选?
  • 安全合规:沃尔玛自养号测评技术搭建要点
  • apk因检测是否使用代理无法抓包绕过方式
  • CUDA解说
  • net core Autofac 替换默认的服务容器 DI,微软自动的容器 不支持命名选项的
  • Spring框架---JDBC模板技术
  • 新华三H3CNE网络工程师认证—VLAN的配置
  • 23种设计模式总结
  • PyQt6应用程序中,如何实现多种语言支持
  • ajax关于axios库的运用小案例
  • 网页版五子棋——匹配模块(客户端开发)
  • 一、文心一言问答系统为什么要分对话,是否回学习上下文?二、文心一言是知识检索还是大模型检索?三、文心一言的词向量、词语种类及多头数量
  • Python中处理Excel的基本概念(如工作簿、工作表等)