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

C++ STL系列-02.泛型入门

C++ STL系列-02.泛型入门

        C++中的泛型编程主要通过模板(template)实现。模板允许我们编写与类型无关的代码,是一种将类型作为参数进行编程的方式。在C++中,模板分为函数模板和类模板。

1. 函数模板

        函数模板允许我们定义一个函数,它可以接受多种类型的参数。例如,我们可以写一个比较两个值大小的函数模板,而不是为每种类型都写一个重载函数。

#include<iostream>
template<typename T>
T max(T a, T b) {return a > b ? a : b;
}
int main(int argc, char*argv[]) {int a = 1, b = 5;std::cout << max(a, b) << std::endl;char c = 'a', d = 'h';std::cout << max(c, d) << std::endl;return 0;
}

        在上面的代码中,template 告诉编译器这是一个模板,T 是一个占位符类型。当我们调用 max 函数时,编译器会根据传入的参数类型自动生成特定类型的函数。

2. 类模板

        类模板允许我们定义一个类,其成员的类型可以由模板参数指定。例如,我们可以定义一个简单的Box类,用来存储任意类型的值。

#include<iostream>
template<typename T>
class Box {
private:T content;
public:Box(T value) : content(value) {} // 赋值给 contentT getValue() {return content;}
};
//使用类模板时,我们需要在创建对象时指定类型:
int main(int argc, char*argv[]) {Box<int>a = 1;Box<std::string>b("hello");std::cout << a.getValue() << std::endl;std::cout << b.getValue() << std::endl;return 0;
}

3.可变参数模板

        C++11引入了可变参数模板,允许模板接受可变数量的参数。例如,我们可以定义一个函数,它可以接受任意数量的参数并打印它们:

#include<iostream>
//  基本可变参数模板示例:打印所有参数
// 递归终止函数
void print() {std::cout << std::endl;
}// 递归展开参数包
template<typename T, typename... Args>
void print(T first, Args... args) {std::cout << first << " ";print(args...);
}
int main(int argc, char*argv[]) {print(1,2,'g',"hello");return 0;
}

C++17引入了折叠表达式,可以更简洁地展开参数包。

#include<iostream>
template<typename... Args>
void print(Args... args) {(std::cout << ... << args) << std::endl;
}
int main(int argc, char*argv[]) {print(1,2,'g',"hello");return 0;
}

使用折叠表达式求和

#include<iostream>
template<typename... Args>
auto sum(Args... args) {return (args + ...);
}
int main(int argc, char*argv[]) {std::cout << sum(1,2,3,4,5) << std::endl;return 0;
}

使用折叠表达式遍历加空格

#include<iostream>
template<typename ...Args>
void print(Args... args) {((std::cout << args << ' '), ...) << std::endl;
}
int main(int argc, char*argv[]) {print(1,2,3,4,5);return 0;
}

将参数包存入vector

#include<iostream>
#include<vector>
template<typename T, typename... Args>
std::vector<T> make_vector(Args... args) {return std::vector<T>{static_cast<T>(args)...};
}
int main(int argc, char*argv[]) {auto vec = make_vector<int>(1, 2, 3, 4, 5);std::cout << "Vector: ";for (auto v : vec) {std::cout << v << " ";}return 0;
}
http://www.xdnf.cn/news/20312.html

相关文章:

  • buuctf-鸡藕椒盐味,[NPUCTF2020]EzRSA,[WUSTCTF2020]大数计算
  • Skia如何渲染 Lottie 动画
  • 《Java线程池面试全解析:从原理到实践的高频问题汇总》
  • 深入剖析Spring Boot启动流程
  • 基于Node.js和Three.js的3D模型网页预览器
  • JP4-7-MyLesson后台前端(二)
  • 轻量应用服务器具体指的是什么?
  • Redis《RedisSerializer》
  • 脑电数据预处理十五:小波变换从原理到实践
  • Codeforces Round 1046 (Div. 2) vp补题
  • C++ 详细讲解vector类
  • 检查CDB/PDB 表空间的说明
  • Linux网络接口命名详解:从eth0到ens33
  • [光学原理与应用-431]:非线性光学 - 能生成或改变激光波长的物质或元件有哪些?
  • GPIO的配置中开漏输出与推挽输出的差别
  • C++零基础第四天:顺序、选择与循环结构详解
  • Protobuf
  • 人工智能辅助荧光浓度检测系统:基于YOLO与RGB分析的Python实现
  • 【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
  • AP1272:新一代高性能LDO稳压器,为精密电子系统提供更优电源解决方案
  • 《秦时明月》系列经典语录分享
  • 云原生的12个要素是什么?
  • 【Linux指南】动静态库与链接机制:从原理到实践
  • 疯狂星期四文案网第62天运营日记
  • 消失的6个月!
  • 从文本到知识:使用LLM图转换器构建知识图谱的详细指南
  • Java多线程学习笔记
  • Nginx 实战系列(二)—— Nginx 配置文件与虚拟主机搭建
  • QML Charts组件之LineSeries、SplineSeries与ScatterSeries
  • 正态分布 - 正态分布的经验法则(68-95-99.7 法则)