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

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.xdnf.cn/news/17055.html

相关文章:

  • 构建企业级Web应用:AWS全栈架构深度解析
  • ⭐CVPR2025 FreeUV:无真值 3D 人脸纹理重建框架
  • IDEA查看源码利器XCodeMap插件
  • DMDRS产品概述和安装部署
  • 服务端⾼并发分布式结构演进之路
  • 每日面试题19:深拷贝和浅拷贝的区别
  • All the Mods 9 - To the Sky - atm9sky 局域网联机报错可能解决方法
  • 玩转 Playwright 有头与无头模式:消除差异,提升爬虫稳定性
  • 人声伴奏分离API:音乐智能处理的强大工具
  • 提升工作效率的利器:Qwen3 大语言模型
  • [LeetCode优选算法专题一双指针——有效三角形的个数]
  • Android 之 图片加载(Fresco/Picasso/Glide)
  • [硬件电路-140]:模拟电路 - 信号处理电路 - 锁定放大器概述、工作原理、常见芯片、管脚定义
  • 多模态大模型综述:BLIP-2详解(第二篇)
  • GraphRAG:基于知识图谱的检索增强生成技术解析
  • 【QT】常⽤控件详解(二)windowOpacitycursorfontsetToolTipfocusPolicystyleSheet
  • 设计模式学习[17]---组合模式
  • 使用 Docker 部署 Golang 程序
  • HoloLens+vuforia打包后遇到的问题
  • Android 之 MVP架构
  • SQL154 插入记录(一)
  • VUE工程化
  • 机器学习sklearn:支持向量机svm
  • 【Redis学习路|第一篇】初步认识Redis
  • WebRTC前处理模块技术详解:音频3A处理与视频优化实践
  • 企业自动化交互体系的技术架构与实现:从智能回复到自动评论—仙盟创梦IDE
  • 怎么修改论文格式呢?提供一份论文格式模板
  • 力扣 hot100 Day64
  • C++ 入门基础(3)
  • MySQL半同步复制机制详解:AFTER_SYNC vs AFTER_COMMIT 的优劣与选择