我有一个定义method()
的库,它返回V*
类型,可以返回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()
的单行包装。
答案 0 :(得分:4)
你的方式看起来对我来说基本上很好,而且大致和我一样。你不希望在这里进行单行,因为它不太清楚。如果你愿意,最终你可以为它创建一个函数。
一个问题:在这里要非常小心所有权语义。谁拥有*value
?可以复制吗?这有意义吗?你可以搬家吗?谁释放了原始对象?
传递指针时总是问这些问题,即使看起来只是为了增加可空性而选择了指针。
说实话,虽然std::optional
在新代码(或代码重构)中更受欢迎,但我并不相信包装这样的函数值得潜在的混淆,更不用说副本的成本(如果确实是必要的话)。
答案 1 :(得分:1)
没有这样的功能。任何值的赋值使得可选包含值。但是你可以提供自己的
template <typename T>
std::optional<T*> optional_ptr(T* ptr) {
return ptr ? std::optional<T*>(ptr) : std::optional<T*>();
}