Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
c++如何使用模板函数和类_c++泛型编程之模板应用详解_创想鸟

c++如何使用模板函数和类_c++泛型编程之模板应用详解

C++模板通过类型参数实现泛型编程,支持模板函数和模板类,提升代码复用性;例如max_value函数可自动适配int或double类型,MyVector类能存储不同数据类型;还可通过模板特化处理char*等特殊类型,确保字符串正确复制与释放;结合SFINAE与enable_if可根据类型特性选择重载函数,实现编译期类型判断;模板元编程允许在编译期计算阶乘等值,优化性能;但需注意代码膨胀和复杂错误信息问题,应保持模板简洁并合理使用特化与静态断言。

c++如何使用模板函数和类_c++泛型编程之模板应用详解

C++模板函数和类,简单来说,就是一种“模具”,你可以用它来生产不同类型的函数或类,而不用为每种类型都写一份代码。这极大地提升了代码的复用性和效率,是C++泛型编程的核心。

使用模板,就像是给你的代码加了一个“类型参数”,这个参数在你真正使用函数或类的时候才会被确定。

解决方案

C++模板主要有两种:模板函数和模板类。

1. 模板函数

立即学习“C++免费学习笔记(深入)”;

模板函数允许你编写一个可以处理多种数据类型的函数,而无需为每种类型编写单独的函数。

template T max_value(T a, T b) {  return (a > b) ? a : b;}int main() {  int int_max = max_value(5, 10);  double double_max = max_value(5.5, 10.2);  std::cout << "Max int: " << int_max << std::endl;  std::cout << "Max double: " << double_max << std::endl;  return 0;}

在这个例子中,

typename T

声明了一个类型参数

T

。当你调用

max_value(5, 10)

时,编译器会推断

T

是

int

类型,并生成一个

int

版本的

max_value

函数。同理,调用

max_value(5.5, 10.2)

会生成一个

double

版本的函数。

2. 模板类

模板类与模板函数类似,但它是针对类的。你可以创建一个通用的类,它可以处理不同类型的数据。

template class MyVector {private:  T* data;  int size;  int capacity;public:  MyVector(int capacity) : capacity(capacity), size(0) {    data = new T[capacity];  }  ~MyVector() {    delete[] data;  }  void push_back(T value) {    if (size == capacity) {      // 简单处理,实际中需要更复杂的扩容逻辑      capacity *= 2;      T* newData = new T[capacity];      for (int i = 0; i < size; ++i) {        newData[i] = data[i];      }      delete[] data;      data = newData;    }    data[size++] = value;  }  T get(int index) const {    if (index = size) {      throw std::out_of_range("Index out of range");    }    return data[index];  }  int getSize() const { return size; }};int main() {  MyVector intVector(10);  intVector.push_back(5);  intVector.push_back(10);  std::cout << "Int Vector Size: " << intVector.getSize() << std::endl;  std::cout << "Element at index 0: " << intVector.get(0) << std::endl;  MyVector doubleVector(5);  doubleVector.push_back(3.14);  doubleVector.push_back(2.71);  std::cout << "Double Vector Size: " << doubleVector.getSize() << std::endl;  std::cout << "Element at index 1: " << doubleVector.get(1) << std::endl;  return 0;}

在这个例子中,

MyVector

是一个模板类,它可以存储任何类型的数据。

MyVector

创建了一个存储

int

类型的向量,而

MyVector

创建了一个存储

double

类型的向量。

模板特化:解决特定类型的特殊需求

有时候,泛型模板并不能完美适用于所有类型。例如,对于

char*

类型,你可能需要提供一个特殊版本的

MyVector

,以便正确地处理字符串的复制和销毁。 这就是模板特化的用武之地。

template  // 注意这个空的模板参数列表class MyVector {private:  char** data;  int size;  int capacity;public:  MyVector(int capacity) : capacity(capacity), size(0) {    data = new char*[capacity];  }  ~MyVector() {    for (int i = 0; i < size; ++i) {      delete[] data[i]; // 释放每个字符串    }    delete[] data;  }  void push_back(char* value) {    if (size == capacity) {      capacity *= 2;      char** newData = new char*[capacity];      for (int i = 0; i < size; ++i) {        newData[i] = data[i];      }      delete[] data;      data = newData;    }    data[size++] = strdup(value); // 使用strdup复制字符串  }  char* get(int index) const {    if (index = size) {      throw std::out_of_range("Index out of range");    }    return data[index];  }  int getSize() const { return size; }};int main() {  MyVector stringVector(5);  stringVector.push_back("hello");  stringVector.push_back("world");  std::cout << "String Vector Size: " << stringVector.getSize() << std::endl;  std::cout << "Element at index 0: " << stringVector.get(0) << std::endl;  return 0;}

在这个特化版本中,

MyVector

使用

strdup

来复制字符串,并在析构函数中释放每个字符串,以避免内存泄漏。

template 

表示这是一个完全特化,针对

char*

类型。

模板元编程:在编译期进行计算

模板的强大之处不仅仅在于代码复用,还在于它允许你在编译期进行计算。 这被称为模板元编程(Template Metaprogramming,TMP)。

template struct Factorial {  static const int value = N * Factorial::value;};template struct Factorial {  static const int value = 1;};int main() {  constexpr int result = Factorial::value; // 编译期计算  std::cout << "Factorial of 5: " << result << std::endl;  return 0;}

在这个例子中,

Factorial

模板在编译期计算阶乘。

constexpr

关键字确保

result

在编译时被计算出来。 模板元编程可以用于各种编译期优化和代码生成。

SFINAE(Substitution Failure Is Not An Error):优雅地处理类型不匹配

SFINAE 是一种C++特性,它允许编译器在模板参数替换失败时,不立即报错,而是尝试其他的模板重载。 这为我们提供了在编译期根据类型特性选择不同代码路径的能力。

#include #include template typename std::enable_if<std::is_integral::value, T>::typeprocess(T value) {  std::cout << "Processing integral value: " << value << std::endl;  return value * 2;}template typename std::enable_if<std::is_floating_point::value, T>::typeprocess(T value) {  std::cout << "Processing floating-point value: " << value << std::endl;  return value * 1.5;}int main() {  int intValue = 10;  double doubleValue = 3.14;  process(intValue);    // 输出: Processing integral value: 10  process(doubleValue);  // 输出: Processing floating-point value: 3.14  return 0;}

在这个例子中,

std::enable_if

和

std::is_integral

、

std::is_floating_point

一起使用,根据

T

是否为整型或浮点型,选择不同的

process

函数重载。 如果

T

不是整型,第一个

process

函数的模板参数替换会失败,但编译器会尝试第二个重载,而不会报错。

模板的局限性与最佳实践

模板虽然强大,但也并非完美。 过度使用模板可能导致代码膨胀,增加编译时间。 此外,模板错误信息通常难以理解。

最佳实践:

尽量保持模板代码简洁。使用

static_assert

进行编译期断言,尽早发现错误。合理使用模板特化,处理特定类型的特殊需求。避免过度使用模板元编程,除非确实有性能上的需求。

总而言之,C++模板是一种强大的工具,可以提高代码的复用性和效率。 理解模板的工作原理,并合理使用它们,可以编写出更通用、更高效的代码。

以上就是c++++如何使用模板函数和类_c++泛型编程之模板应用详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1475856.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++内存模型与C++11标准规定分析
上一篇 2025年12月18日 23:44:56
C++如何读取整行数据getline使用技巧
下一篇 2025年12月18日 23:45:10

相关推荐

  • 淘宝百亿补贴多久才能再买一次?购物技巧有哪些呢?「限购规则全破解」淘宝百亿补贴二次购买攻略+5大必学抢购技巧,手慢无!

    淘宝百亿补贴多久才能再买一次?购物技巧有哪些呢?「限购规则全破解」淘宝百亿补贴二次购买攻略+5大必学抢购技巧,手慢无!淘宝百亿补贴多久才能再买一次?购物技巧有哪些呢?「限购规则全破解」淘宝百亿补贴二次购买攻略+5大必学抢购技巧,手慢无!淘宝百亿补贴多久才能再买一次?购物技巧有哪些呢?「限购规则全破解」淘宝百亿补贴二次购买攻略+5大必学抢购技巧,手慢无!淘宝百亿补贴多久才能再买一次?购物技巧有哪些呢?「限购规则全破解」淘宝百亿补贴二次购买攻略+5大必学抢购技巧,手慢无!

    在淘宝百亿补贴活动中成功下单心仪好物后,许多用户都会面临一个共同问题:「下次还能不能继续享受补贴优惠?」。根据平台现行规则,同一账号购买相同补贴商品通常需等待7至30天不等,具体时限会因活动节奏、商品类别等因素有所调整。本文将全面解读百亿补贴的购买机制,并分享5项极具实操价值的抢购策略,助你轻松把握…

    2026年9月25日 • 用户投稿
    000
  • 豆包AI会保存聊天记录吗 隐私政策与数据管理说明

    豆包AI会保存聊天记录吗 隐私政策与数据管理说明豆包AI会保存聊天记录吗 隐私政策与数据管理说明豆包AI会保存聊天记录吗 隐私政策与数据管理说明豆包AI会保存聊天记录吗 隐私政策与数据管理说明

    豆包ai可能会保存聊天记录,但具体取决于其隐私政策和技术机制。1. 聊天记录通常会被短期或长期保存以提供连贯服务,但用途仅限于优化体验;2. 用户可通过检查隐私设置、主动删除记录或联系客服来管理数据;3. 隐私政策关键点包括数据收集范围、用途、存储保护及用户权利,建议使用前仔细阅读相关政策以确保数据…

    2026年9月25日 • 用户投稿
    000
  • Debian Tomcat日志中的慢查询如何优化

    Debian Tomcat日志中的慢查询如何优化Debian Tomcat日志中的慢查询如何优化Debian Tomcat日志中的慢查询如何优化Debian Tomcat日志中的慢查询如何优化

    本文探讨如何在Debian系统上优化Tomcat应用中的数据库慢查询。需要注意的是,Tomcat本身不记录慢查询,而是由数据库(如MySQL)负责。因此,优化过程主要针对数据库层面。 第一步:启用数据库慢查询日志 首先,确保你的数据库已启用慢查询日志记录功能。以MySQL为例,可以通过以下两种方式实…

    2026年9月25日 • 用户投稿
    000
  • Yandex网页版入口在哪?全球第二大搜索引擎使用指南!

    Yandex网页版入口在哪?全球第二大搜索引擎使用指南!Yandex网页版入口在哪?全球第二大搜索引擎使用指南!Yandex网页版入口在哪?全球第二大搜索引擎使用指南!Yandex网页版入口在哪?全球第二大搜索引擎使用指南!

    Yandex网页版入口是https://yandex.com/,该平台提供多语言搜索、图片识别、音视频索引、实时新闻及地图导航等服务,界面简洁支持深色模式,具备翻译、邮箱、应用中心等特色功能。 1、立即进入“☞☞☞☞点击yandex网页版入口☜☜☜☜”; 2、立即进入“☞☞☞☞点击全球第二大搜索引擎…

    2026年9月25日 • 用户投稿
    400
  • Linux sudo日志查看与分析方法

    sudo日志默认存储在/var/log/auth.log(Debian系)或/var/log/secure(RHEL系),可通过grep、tail等命令筛选用户操作、成功命令及失败尝试,日志包含时间、用户、命令等信息;可通过visudo配置独立日志文件及输入输出记录,结合journalctl、awk…

    2026年9月25日
    000
  • VB添加扩展控件方法

    VB添加扩展控件方法VB添加扩展控件方法VB添加扩展控件方法VB添加扩展控件方法

    在VB中添加扩展控件的操作步骤如下: 第一步:在工具箱的空白区域点击鼠标右键。 第二步:从弹出的菜单中选择“部件”命令,或点击对应的快捷按钮。 第三步:系统将弹出“部件”对话框,在其中可以浏览可用的控件列表。 度加剪辑 度加剪辑(原度咔剪辑),百度旗下AI创作工具 63 查看详情 第四步:找到需要添…

    2026年9月25日 • 用户投稿
    000
  • Mac如何清理系统缓存_Mac系统缓存与垃圾文件清理方法

    Mac如何清理系统缓存_Mac系统缓存与垃圾文件清理方法Mac如何清理系统缓存_Mac系统缓存与垃圾文件清理方法Mac如何清理系统缓存_Mac系统缓存与垃圾文件清理方法Mac如何清理系统缓存_Mac系统缓存与垃圾文件清理方法

    Mac运行慢或存储紧张时,系统缓存和临时文件是主因。可通过手动清理系统级缓存(/Library/Caches)、用户专属缓存(~/Library/Caches)、系统日志(~/Library/Logs 和 /var/log),使用macOS内置存储管理工具优化存储,并定期重启Mac以清除临时文件,有…

    2026年9月25日 • 用户投稿
    000
  • Debian如何回收软件许可证

    Debian如何回收软件许可证Debian如何回收软件许可证Debian如何回收软件许可证Debian如何回收软件许可证

    本文介绍如何在Debian系统中回收软件许可证,实际上就是卸载软件包并清理相关文件。 您可以使用dpkg或apt工具来完成此操作。 方法一:使用dpkg 卸载软件包: 保留配置文件卸载: sudo dpkg -r package_name (其中package_name替换为软件包名称)彻底卸载,包…

    2026年9月25日 • 用户投稿
    000
  • Java布尔方法条件逻辑解析与预期行为校正

    Java布尔方法条件逻辑解析与预期行为校正Java布尔方法条件逻辑解析与预期行为校正Java布尔方法条件逻辑解析与预期行为校正Java布尔方法条件逻辑解析与预期行为校正

    本文旨在探讨Java中布尔方法条件表达式的常见误解,通过一个具体的kindaLiked()方法案例,详细分析代码逻辑与预期行为不符的原因。我们将演示如何精确定义条件,确保方法返回结果与业务逻辑一致,并提供示例代码、调试技巧及最佳实践,以帮助开发者编写更准确、可维护的布尔判断逻辑。 理解布尔方法与条件…

    2026年9月25日 • 用户投稿
    100
  • windows怎么查看wifi信号强度_windows系统查看wifi信号强度的方法

    首先检查Wi-Fi信号强度以判断网络问题,可通过任务栏图标查看图形化信号格数及百分比;其次使用命令提示符输入netsh wlan show interfaces获取信号强度百分比和SSID等详细信息;最后可借助Acrylic Wi-Fi Home等第三方工具扫描周边网络的RSSI值与信道占用情况,分…

    2026年9月25日
    000
  • 电脑机箱风道设计对散热效率的影响有多大?

    电脑机箱风道设计对散热效率的影响有多大?电脑机箱风道设计对散热效率的影响有多大?电脑机箱风道设计对散热效率的影响有多大?电脑机箱风道设计对散热效率的影响有多大?

    合理的机箱风道设计能有效降低温度,提升硬件稳定性。判断风道是否合理可通过监控软件查看CPU、GPU温度(如满载超80℃或85℃),观察灰尘堆积情况及手触感知风量分布。理想风道为前进风、后排风的水平气流,塔式散热器应朝向后排风扇,高端显卡可加底面进风。理线也关键,杂乱线材会阻碍气流,需用扎带等整理。风…

    2026年9月25日 • 用户投稿
    000
  • 利用OSHI库监测与计算磁盘活动时间及传输速率

    利用OSHI库监测与计算磁盘活动时间及传输速率利用OSHI库监测与计算磁盘活动时间及传输速率利用OSHI库监测与计算磁盘活动时间及传输速率利用OSHI库监测与计算磁盘活动时间及传输速率

    本文详细介绍了如何利用Java OSHI库获取磁盘的活动时间与传输速率。通过HWDiskStore类的getReads()、getWrites()和getTransferTime()方法,结合时间间隔内的增量数据,可以精确计算出磁盘的活跃百分比和每秒传输次数。教程提供了示例代码,并逐步解析了数据采集…

    2026年9月25日 • 用户投稿
    000
  • 如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀

    如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀

    使用豆包ai可以高效生成全面的单元测试代码,首先确保函数或类逻辑清晰稳定,如定义了clean_input函数用于清理用户输入字符串;接着提示ai生成测试用例时描述功能背景,ai将自动覆盖正常值、空值、边界值及异常输入等场景;生成的测试样例包括空字符串、none、前后空格、大写字母、数字符号等情况;随…

    2026年9月25日 • 用户投稿
    100
  • 为什么高配置电脑仍会出现软件卡顿现象?

    为什么高配置电脑仍会出现软件卡顿现象?为什么高配置电脑仍会出现软件卡顿现象?为什么高配置电脑仍会出现软件卡顿现象?为什么高配置电脑仍会出现软件卡顿现象?

    高配置电脑卡顿多由软件、驱动、系统配置及使用习惯导致。需通过任务管理器、资源监视器等工具排查CPU、内存、磁盘占用,检查温度与驱动状态;优化电源模式、关闭无用后台程序、更新或回滚显卡驱动,并合理设置虚拟内存,才能全面提升系统流畅度。 高配置电脑出现软件卡顿现象,这其实是个挺常见,也常常让人感到困惑的…

    2026年9月25日 • 用户投稿
    100
  • Debian Node.js 日志如何归档

    Debian Node.js 日志如何归档Debian Node.js 日志如何归档Debian Node.js 日志如何归档Debian Node.js 日志如何归档

    本文介绍在 Debian 系统上有效管理和归档 Node.js 应用日志的最佳实践。 以下步骤将帮助您构建一个健壮的日志管理系统: 选择合适的日志工具: 使用成熟的日志库,例如 Winston 或 Bunyan,它们提供日志级别控制、灵活的输出目标(文件、控制台、远程服务器)以及日志格式化功能,简化…

    2026年9月25日 • 用户投稿
    100
  • exe文件打不开的解决方法

    exe文件打不开的解决方法exe文件打不开的解决方法exe文件打不开的解决方法exe文件打不开的解决方法

    exe文件无法运行时该怎么办呢?不少朋友都曾遇到过这种情况,这可能与某些病毒或第三方程序有关。通常来说,exe文件无法打开是因为注册表被错误地修改了所致。在这种情况下,我们可以利用记事本来调整注册表以解决问题。接下来就让小编带领大家了解具体的解决步骤吧! 在常规操作下,电脑的安全卫士会对exe文件进…

    2026年9月25日 • 用户投稿
    100
  • 抖音多少粉丝才有收益?变现模式有哪些?揭秘6大主流变现模式

    抖音多少粉丝才有收益?变现模式有哪些?揭秘6大主流变现模式抖音多少粉丝才有收益?变现模式有哪些?揭秘6大主流变现模式抖音多少粉丝才有收益?变现模式有哪些?揭秘6大主流变现模式抖音多少粉丝才有收益?变现模式有哪些?揭秘6大主流变现模式

    当你在抖音看到百万粉丝博主轻松月入过万时,是否也好奇:到底需要多少粉丝才能开始赚钱?其实,抖音的变现方式比你想象中更加多元和灵活。从刚起步的千粉账号到坐拥百万粉丝的大v,不同阶段都有对应的盈利模式。本文将深入剖析粉丝数量与变现路径之间的关系,助你掌握在抖音实现收入增长的核心逻辑。 1. 初期变现门槛…

    2026年9月25日 • 用户投稿
    100
  • 夸克扫描王怎么去除手写痕迹_夸克扫描件擦除手写字迹教程

    夸克扫描王怎么去除手写痕迹_夸克扫描件擦除手写字迹教程夸克扫描王怎么去除手写痕迹_夸克扫描件擦除手写字迹教程夸克扫描王怎么去除手写痕迹_夸克扫描件擦除手写字迹教程夸克扫描王怎么去除手写痕迹_夸克扫描件擦除手写字迹教程

    使用夸克扫描王可去除手写笔记保留打印内容:1. 用“涂鸦擦除”手动清除局部字迹;2. 启用“智能增强”自动分离并隐藏手写体;3. 导出高清图片至Photoshop等工具精细修复,最终获得干净电子版。 如果您需要将一份带有手写笔记的纸质文档转换为干净的电子版,但希望去除手写痕迹以保留原始打印内容,可以…

    2026年9月25日 • 用户投稿
    600
  • 如何利用日志提升网站安全

    如何利用日志提升网站安全如何利用日志提升网站安全如何利用日志提升网站安全如何利用日志提升网站安全

    网站安全至关重要,而日志分析是提升安全性的关键环节。本文将介绍如何有效利用日志增强网站安全防护。 一、日志收集与集中管理 全面收集服务器、应用、数据库及网络设备等所有相关日志,并使用日志管理系统(如ELK Stack、Splunk或Graylog)进行集中存储和分析,以便高效处理海量日志数据。 二、…

    2026年9月25日 • 用户投稿
    200
  • 使用OSHI库精确测量磁盘活动时间和传输速率

    使用OSHI库精确测量磁盘活动时间和传输速率使用OSHI库精确测量磁盘活动时间和传输速率使用OSHI库精确测量磁盘活动时间和传输速率使用OSHI库精确测量磁盘活动时间和传输速率

    本文详细介绍了如何利用OSHI库的HWDiskStore类来精确测量磁盘活动时间百分比和数据传输速率。通过获取磁盘读写操作、总传输时间等累积性统计数据的快照,并计算两次快照之间的差值,可以准确分析特定时间段内的磁盘活跃度及每秒传输次数,从而有效监控系统磁盘性能。 OSHI库与磁盘性能监控 oshi(…

    2026年9月25日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信