什么时候适合使用 std::optional
Posted
技术标签:
【中文标题】什么时候适合使用 std::optional【英文标题】:When is it appropriate to use std::optional 【发布时间】:2019-09-17 18:26:34 【问题描述】:我想知道这是否会被认为是 std::optional 的有效用法。我有一个返回process_id
(std::uint32_t
值)的函数,如果我们无法找到目标进程 ID 或返回 std,则使用返回 0 的标准“std::uint32_t
”函数会更有效: :optional 更合适?
示例:
std::optional<std::uint32_t> FindProcessID(std::string_view process)
bool find = false;
if (!find)
// we fail to find the process_id and return nothing.
return std::nullopt;
else if (find)
return 100; // return the id
我在返回一个 unique_ptr 时也这样做 - 也反对只返回一个 nullptr,但我不确定这是否会被视为“滥用”所述功能,以及是否最好只返回 0 并检查对于那个值。提前谢谢你。
【问题讨论】:
【参考方案1】:我想知道这是否会被视为
std::optional
的有效用法
是的,是的,是的 - 这就是 std::optional
的用途!
如果我们失败了返回 0 会更有效吗
技术上是的,std::optional
是一个包装器,因此它的开销很小。然而,这是代码中性能瓶颈的可能性极低。如果不确定,请创建一个基准并比较您的函数的两个版本。
我目前也在返回 unique_ptr 时这样做,但我不确定这是否会被视为对所述功能的“滥用”
这确实不是std::unique_ptr
的预期惯用用例。您的代码的读者会期望 std::unique_ptr
处理某些(可能是多态的)对象的独占所有权。将原始整数类型放入智能指针中的有效场景也不是很多,对于非常适合 std::optional
的用例使用 std::unique_ptr
也不是好习惯。
【讨论】:
更不用说unique_ptr
在没有充分理由为此用例这样做时强制动态分配。
感谢您的信息和帮助! unique_ptr 用于通过自定义删除器实现带有 WINAPI 句柄的 RAII。该函数要么打开句柄,要么通过 std::optional 返回 std::nullopt。
啊,所以std::unique_ptr
不是要环绕uint32_t
?对不起,那我理解错了你问题的最后一部分。使用 std::unique_ptr
作为带有自定义删除器的 RAII 包装器绝对没问题!以上是关于什么时候适合使用 std::optional的主要内容,如果未能解决你的问题,请参考以下文章