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

5

我想知道这是否被认为是std::optional的有效用法。我有一个返回process_idstd::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个回答

11

我想知道这种用法是否可以视为std::optional的有效使用

是的,是的,是的 - 这就是std::optional的用途!

如果失败了返回0会更有效吗?

技术上是的,std::optional是一个包装器,因此它带有微小的开销。然而,在您的代码中,这是性能瓶颈的可能性非常低。如果不确定,请创建基准测试并比较函数的两个版本。

我目前在返回unique_ptr时也是这样做的,但我不确定这是否被认为是该功能的"滥用"

这确实不是std::unique_ptr的预期、惯用用例。读者会期望std::unique_ptr处理某些(可能是多态的)对象的独占所有权。把基本整型放入智能指针中的有效方案很少,使用std::unique_ptr来处理非常适合使用std::optional的用例也不是好的实践。


4
更不用说 unique_ptr 在这种情况下强制使用动态分配,而没有充分的理由。 - chris
1
感谢您提供的信息和帮助!unique_ptr被用于使用自定义删除器实现RAII与WINAPI句柄。该函数通过std::optional打开句柄或返回std::nullopt。 - devptr
4
е•ҠпјҢжүҖд»Ҙstd::unique_ptr并дёҚжҳҜз”ЁжқҘеҢ…иЈ…uint32_tзҡ„пјҹжҠұжӯүпјҢжҲ‘иҜҜи§ЈдәҶдҪ й—®йўҳзҡ„жңҖеҗҺдёҖйғЁеҲҶгҖӮдҪҝз”Ёе…·жңүиҮӘе®ҡд№үеҲ йҷӨеҷЁзҡ„std::unique_ptrдҪңдёәRAIIеҢ…иЈ…еҷЁе®Ңе…ЁжІЎжңүй—®йўҳпјҒ - lubgr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接