C++ 将nullptr转换为std::可选

C++ 将nullptr转换为std::可选,c++,optional,nullptr,C++,Optional,Nullptr,我有一个定义method()的库,它返回typeV*,并且可以返回nullptr。将该方法包装成std::optional的最佳方法是什么 天真的方式是这样的: std::optional<V> maybe_value; V* value = method(); if (value != nullptr) { maybe_value = *value; // assuming the type is even copyable } std::可选值; V*值=方法()

我有一个定义
method()
的库,它返回type
V*
,并且可以返回
nullptr
。将该方法包装成
std::optional
的最佳方法是什么

天真的方式是这样的:

std::optional<V> maybe_value;
V* value = method();
if (value != nullptr) {
    maybe_value = *value;    // assuming the type is even copyable
}
std::可选值;
V*值=方法();
如果(值!=nullptr){
可能_value=*value;//假设该类型甚至是可复制的
}

但是我希望已经有了一些STL函数,我可以用它作为
method()

的单行包装器来完成这项工作,你的方式对我来说基本上很好,我也会这么做。你不需要一条班轮,因为它不是很清楚。如果您愿意,最终您可以为它创建一个函数

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

当传递指针时,始终要问这些问题,即使选择指针似乎只是为了增加可空性


老实说,尽管在新代码(或正在重构的代码)中,
std::optional
更可取,但我不认为这样包装一个函数值得潜在的混淆,更不用说复制的成本了(如果确实有必要的话)。

我觉得你的方式基本上很好,大致上就是我要做的。你不需要一条班轮,因为它不是很清楚。如果您愿意,最终您可以为它创建一个函数

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

当传递指针时,始终要问这些问题,即使选择指针似乎只是为了增加可空性


老实说,尽管在新代码(或正在重构的代码)中,
std::optional
更可取,但我不认为这样包装一个函数值得潜在的混淆,更不用说复制成本了(如果确实需要的话)。

没有这样的函数。任何值的赋值都会使包含值的选项成为可选。但是你可以自己提供

template <typename T>
std::optional<T*> optional_ptr(T* ptr) {
    return ptr ? std::optional<T*>(ptr) : std::optional<T*>();
}
模板
std::可选ptr(T*ptr){
返回ptr?std::optional(ptr):std::optional();
}

没有这样的功能。任何值的赋值都会使包含值的选项成为可选。但是你可以自己提供

template <typename T>
std::optional<T*> optional_ptr(T* ptr) {
    return ptr ? std::optional<T*>(ptr) : std::optional<T*>();
}
模板
std::可选ptr(T*ptr){
返回ptr?std::optional(ptr):std::optional();
}

事实上,你的方式正是我所做的,包括
可能
前缀;)事实上,你的方式正是我所做的,包括
maybe.
prefix;)