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

时间:2019-04-29 06:35:16

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

我想知道这是否被认为是std :: optional的有效用法。我有一个返回process_id(值std::uint32_t的函数,如果没有找到目标进程ID,有一个标准的“ std::uint32_t”函数返回0会更有效吗?还是返回std :: 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 个答案:

答案 0 :(得分:10)

  

我想知道这是否被视为std::optional

的有效用法。

是的,是的,是的-这就是std::optional的目的!

  

如果失败,返回0会更有效

从技术上讲,std::optional是包装器,因此开销很小。但是,这可能是代码中的性能瓶颈。如果不确定,请创建一个基准测试并比较函数的两个版本。

  

我目前正在返回一个unique_ptr时正在执行此操作,但是我不确定是否将其视为所述功能的“滥用”

这确实不是std::unique_ptr的预期惯用例。您的代码读者希望std::unique_ptr处理某些(可能是多态的)对象的专有所有权。既没有很多有效的方案将原始整数类型放入智能指针中,也不是将std::unique_ptr用于最适合std::optional的用例的优良作法。