什么时候适合使用 std::optional

Posted

技术标签:

【中文标题】什么时候适合使用 std::optional【英文标题】:When is it appropriate to use std::optional 【发布时间】:2019-09-17 18:26:34 【问题描述】:

我想知道这是否会被认为是 std::optional 的有效用法。我有一个返回process_idstd::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的主要内容,如果未能解决你的问题,请参考以下文章

什么时候适合使用虚方法?

什么时候不适合使用派生表?

什么时候适合使用 std::optional

什么时候适合使用 Django 上下文处理器?

什么时候适合使用python2.x

什么时候适合使用 df.value_counts() vs df.groupby('...').count()?