将nullptr转换为std :: optional

时间:2018-03-09 01:48:10

标签: c++ optional nullptr

我有一个定义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()的单行包装。

2 个答案:

答案 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*>();
}