【问题标题】:When is it appropriate to use std::optional什么时候适合使用 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 并检查对于那个值。提前谢谢你。

【问题讨论】:

    标签: c++ stl return unique-ptr stdoptional


    【解决方案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 包装器绝对没问题!
    猜你喜欢
    • 2011-09-13
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2019-08-25
    相关资源
    最近更新 更多