将 nullptr 转换为 std::optional

convert nullptr to std::optional

我有一个定义 method() 的库,return 可以键入 V* 并且可以 return nullptr。包装该方法以将值转换为 std::optional<V> 的最佳方法是什么?

天真的方法是这样的:

std::optional<V> maybe_value;
V* value = method();
if (value != nullptr) {
    maybe_value = *value;    // assuming the type is even copyable
}

但我希望已经有一些 STL 函数可以用来作为围绕 method().

的单行包装器来执行此操作

我觉得你的方式基本上没问题,我也差不多会这样做。你不想要一个one-liner,因为它不是很清楚。如果你愿意,最终你可以为它创建一个函数。

一个问题:要非常小心这里的所有权语义。谁拥有 *value?可以复制吗?那有意义吗?你可以移动它吗?谁释放了原始对象?

在传递指针时总是问这些问题,即使选择指针似乎只是为了添加可空性。

老实说,尽管 std::optional 在新代码(或您正在重构的代码)中更可取,但我不相信 wrapping 像这样的函数这值得潜在的混乱,更不用说副本的成本了(如果确实有必要的话)。

暂无此功能。任何值的分配都会使可选包含一个值。但是你可以提供你自己的

template <typename T>
std::optional<T*> optional_ptr(T* ptr) {
    return ptr ? std::optional<T*>(ptr) : std::optional<T*>();
}