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

template<typename R = void> 意义

在 C++ 中,template<typename R = void> 表示定义一个模板参数 R,其默认类型为 void。这意味着:

  1. 如果用户没有显式指定 R,则 R 默认为 void
  2. 如果用户显式指定了 R(如 template<typename R = void> 后面跟着 <int>),则 R 会被替换为指定的类型(如 int)。

1. 基本用法

1.1 默认模板参数 void

template<typename R = void>
class MyClass {
public:
using ResultType = R; // 定义一个类型别名
};
int main() {
MyClass<> obj1; // R 默认为 void
MyClass<int> obj2; // R 显式指定为 int
// 检查类型
static_assert(std::is_same_v<MyClass<>::ResultType, void>); // true
static_assert(std::is_same_v<MyClass<int>::ResultType, int>); // true
}
  • MyClass<> 使用默认模板参数 void
  • MyClass<int> 显式指定 R 为 int

1.2 结合函数模板

template<typename R = void>
R default_value() {
if constexpr (std::is_void_v<R>) {
return; // void 返回类型不能有返回值
} else {
return R{}; // 默认构造 R 类型
}
}
int main() {
default_value(); // R = void,无返回值
int x = default_value<int>(); // R = int,返回 0(默认构造)
}
  • 当 R = void 时,函数不能返回任何值。
  • 当 R = int 时,函数返回 int{}(即 0)。

2. 常见应用场景

2.1 回调函数(Callback)的默认返回类型

template<typename R = void>
class Callback {
public:
using ReturnType = R;
virtual R execute() = 0; // 纯虚函数
};
// 特化 void 返回类型的情况
template<>
class Callback<void> {
public:
void execute() { /* 不需要返回值 */ }
};
  • 如果回调函数不需要返回值,可以使用 Callback<>(默认 void)。
  • 如果需要返回值,可以指定 Callback<int> 等。

2.2 函数对象(Functor)的默认行为

template<typename R = void>
struct Identity {
R operator()(R x) { return x; }
};
template<>
struct Identity<void> {
void operator()(auto x) { /* 不返回任何值 */ }
};
int main() {
Identity<int> id_int;
int a = id_int(42); // 返回 42
Identity<> id_void;
id_void(42); // 无返回值
}
  • Identity<int> 返回输入值。
  • Identity<>(即 Identity<void>)不返回任何值。

2.3 通用函数包装器(类似 std::function

template<typename R = void, typename... Args>
class FunctionWrapper {
public:
virtual R invoke(Args... args) = 0;
};
// 特化 void 返回类型
template<typename... Args>
class FunctionWrapper<void, Args...> {
public:
virtual void invoke(Args... args) = 0;
};
  • 如果 R = void,则 invoke() 不返回任何值。
  • 否则,invoke() 返回 R 类型的值。

3. 与 std::function 的对比

C++ 标准库中的 std::function 也使用了类似的技巧:

std::function<int()> func1; // 返回 int
std::function<void()> func2; // 返回 void
std::function<> func3; // 错误!必须指定返回类型
  • std::function 不能省略返回类型(必须显式指定 R)。
  • 但自定义模板可以设置默认 R = void,使 MyFunction<> 合法。

4. 总结

特性说明
template<typename R = void>定义一个默认类型为 void 的模板参数
适用场景回调函数、函数对象、通用包装器
与 void 相关的特殊处理void 不能用于返回值(如 return;)或构造(如 R{}
C++17 if constexpr 结合可以针对 void 和非 void 类型做不同处理

关键点

  1. void 是一个不完整的类型,不能直接实例化(如 void x; 非法)。
  2. void 用于函数返回类型时,表示不返回任何值
  3. 模板默认参数 可以简化代码,避免重复指定常见类型(如 void)。

这种技巧在泛型编程中非常有用,特别是需要处理“可能无返回值”的情况。

http://www.dtcms.com/a/312807.html

相关文章:

  • 2. 字符设备驱动
  • LeetCode Hot 100,快速学习,不断更
  • #C语言——刷题攻略:牛客编程入门训练(四):运算
  • Kazam产生.movie.mux后恢复视频为.mp4
  • 小宿科技:AI Agent 的卖铲人
  • zookeeper持久化和恢复原理
  • idea中.xml文件的块注释快捷键
  • Hugging Face 模型文件介绍
  • IDEA查看源码利器XCodeMap插件
  • 【高等数学】第七章 微分方程——第八节 常系数非齐次线性微分方程
  • 【lucene】ByteBuffersIndexInput
  • k8s日志收集
  • Redis面试精讲 Day 8:Stream消息队列设计与实现
  • 对接古老系统的架构实践:封装混乱,走向有序
  • [硬件电路-146]:模拟电路 - DCDC与LDO详解、常见芯片、管脚定义
  • 基于 LangChain + 通义千问 + bge-large 中文 Embedding 搭建一个RAG问答示例
  • TVS二极管数据手册解读
  • 【lucene】ByteBufferGuard
  • Android 之 MVVM架构
  • 【MySQL】MySQL中锁有哪些?
  • Flutter 函数的基本使用
  • day39 力扣198.打家劫舍 力扣213.打家劫舍II 力扣337.打家劫舍 III
  • 常见框架漏洞靶场攻略
  • Java 实现poi方式读取word文件内容
  • 力扣967:连续差相同的数字
  • Mysql1
  • Docker-03.快速入门-部署MySQL
  • python的蛋糕店管理系统
  • MySQL的创建管理表:
  • 求根到叶子节点数字之和