将 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*>();
}
我有一个定义 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*>();
}