C++泛型编程06(默认模板实参)

server/2025/2/4 19:32:48/

文章目录

      • 1.4 默认模板实参 (Default Template Arguments)
        • 示例:灵活定义返回类型

当然,这里是对关于默认模板实参(Default Template Arguments)的内容进行了改进和优化后的叙述:

1.4 默认模板实参 (Default Template Arguments)

在C++中,可以为模板参数设置默认值,这些预设的值被称为默认模板实参。它们不仅适用于类模板,也可用于函数模板,极大地增强了代码的灵活性与复用性。

示例:灵活定义返回类型

考虑一个场景,需要根据不同的输入参数类型动态确定函数的返回类型。通过使用模板默认参数,我们可以简化这个过程,并提供一种自然的方式来处理不同类型间的转换。

方法一:使用条件运算符

#include <type_traits>template <typename T1, typename T2,typename RT = std::decay_t<decltype(true ? T1() : T2())>>
RT max(T1 a, T2 b) {return b < a ? a : b;
}

这段代码利用了条件运算符来推断两个参数类型的共同类型,并且通过std::decay_t确保返回类型不是引用类型。然而,这种方法要求T1和T2必须具有无参数构造函数,这在实际应用中可能并不总是可行的。

方法二:利用std::common_type

另一种更通用的方法是直接使用std::common_type特性来自动确定最合适的返回类型:

#include <type_traits>template <typename T1, typename T2,typename RT = std::common_type_t<T1, T2>>
RT max(T1 a, T2 b) {return b < a ? a : b;
}

这种方式不需要对象实例化,因此避免了对构造函数的需求,同时也能正确处理基本类型和用户自定义类型之间的转换。

注意点

虽然可以将返回类型作为第一个模板参数并尝试从后续参数中推断其类型,但这种做法通常会增加调用时的复杂度,因为需要明确指定多个模板参数。因此,在大多数情况下,让编译器根据传入的实际参数自动推断出最佳的返回类型是最简洁有效的解决方案。

综上所述,通过合理运用默认模板实参,不仅可以提升代码的可读性和维护性,还能有效应对复杂的类型推导问题。


http://www.ppmy.cn/server/164963.html

相关文章

Spring的AOP思想中事物管理注意点

我们以事务管理实现AOP思想 通过在Service层加入事务管理,因为Service层可能使用多个DAO(多条SQL语句) 要保证这些SQL要么同时成功,要么同时失败,例如:学生Serivce:删除学生的时候,还需要删除学生关联信息(选课信息) 只有都删除成功才提交,如果有一条执行失败…

Rust 的基本类型有哪些,他们存在堆上还是栈上,是否可以COPY?

Rust 的基本类型主要包括以下几类&#xff1a; 1. 整数类型&#xff08;Integer&#xff09; Rust 提供了有符号和无符号的整数类型&#xff1a; 有符号整数&#xff08;i8, i16, i32, i64, i128, isize&#xff09;无符号整数&#xff08;u8, u16, u32, u64, u128, usize&a…

EtherCAT主站IGH-- 29 -- IGH之mailbox.h/c文件解析

EtherCAT主站IGH-- 29 -- IGH之mailbox.h/c文件解析 0 预览一 该文件功能`mailbox.c` 文件功能函数预览二 函数功能介绍`mailbox.c` 中主要函数的作用1. `ec_slave_mbox_prepare_send`2. `ec_slave_mbox_prepare_check`3. `ec_slave_mbox_check`4. `ec_slave_mbox_prepare_fetc…

Kotlin 使用 Springboot 反射执行方法并自动传参

在使用反射的时候&#xff0c;执行方法的时候在想如果Springboot 能对需要执行的反射方法的参数自动注入就好了。所以就有了下文。 知识点 获取上下文通过上下文获取 Bean通过上下文创建一个对象&#xff0c;该对象所需的参数由 Springboot 自己注入 创建参数 因为需要对反…

Java 大视界 -- Java 大数据在量子通信安全中的应用探索(69)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Spark Streaming的背压机制的原理与实现代码及分析

Spark Streaming的背压机制是一种根据JobScheduler反馈的作业执行信息来动态调整Receiver数据接收率的机制。 在Spark 1.5.0及以上版本中&#xff0c;可以通过设置spark.streaming.backpressure.enabled为true来启用背压机制。当启用背压机制时&#xff0c;Spark Streaming会自…

CSS Module 常用笔记

Date: January 30, 2025 CSS 先介绍下普通 CSS&#xff0c;再简明介绍下 css module 的使用 普通 CSS 内联 style 定义&#xff1a; 内联 style 是通过在元素的 style 属性中直接设置 CSS 样式。这种方式允许我们直接在 JSX 中为组件或元素添加样式。 写法&#xff1a; &…

二叉树——102,107,199,637

前中后序遍历是二叉树的深度遍历&#xff0c;而层序遍历则是二叉树的广度遍历。顾名思义&#xff0c;二叉树的层序遍历就是一层一层遍历二叉树的每一个节点。今天的几道题都是关于二叉树的层序遍历的&#xff0c;大体思路都非常相似&#xff0c;都是在层序遍历的基础上实现了有…