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

dev*_*ptr 4 c++ stl return unique-ptr stdoptional

我想知道这是否被认为是std :: optional的有效用法。我有一个返回process_idstd::uint32_t值)的std::uint32_t函数,如果没有找到目标进程ID,返回一个标准的“ ”函数会更有效吗?或者返回一个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
}
Run Code Online (Sandbox Code Playgroud)

在返回unique_ptr以及返回nullptr的同时,我也在这样做,但是我不确定是否将其视为所述功能的“滥用”,并且最好返回0并检查该值是否更好。先感谢您。

lub*_*bgr 10

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

是,是,是-这是干什么std::optional的!

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

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

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

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

  • 更不用说在没有充分理由为此情况下使用“ unique_ptr”时会强制进行动态分配。 (3认同)
  • 嗯,所以`std :: unique_ptr`不是要包裹在`uint32_t`周围吗?抱歉,我不正确地理解了您问题的最后一部分。将`std :: unique_ptr`用作带有自定义删除器的RAII包装器绝对可以! (3认同)