快速提示:如何从函数返回 std::optional

这是从函数返回 std::optional 的模板:

optional_function.cpp
#include <optional>
// 记住使用 --std=c++17 或等效选项编译

std::optional<double> myOptionalFunction() {
    auto myValue = /* ... */;
    if(myValue.IsNull()) {
        // 我们没有值
        return std::nullopt; // .has_value() => false
    }
    // 我们有值,所以返回值
    return myValue.AsDouble(); // .has_value() => true
}

std::nullopt 是将无值作为 std::optional 返回的简便方法。使用此方法而不是默认构造函数(在此例中为 return std::optional<double>()),你不必显式输入包括模板参数的完整限定名称(如果你 use namespace std; 则为 optional<double>)。这样更易读和复制粘贴。

在最后一行我们可以直接返回 double(在此示例中为 myValue.AsDouble())。为什么?因为这将隐式调用 std::optional<double>(const double& value)隐式构造函数,因此将你的 double 转换为 std::optional<double>() 实例。

用法示例:

usage_example.cpp
#include // std::optional
#include  // std::cerr, std::endl

using namespace std;

std::optional myOptionalFunction() {
    /* 你的代码放在这里! */
}

int main() {
    auto myOptionalValue = myOptionalFunction;
    if(myOptionalValue.has_value()) {
         // 打印错误消息
         cerr << "The optional has no value!" << endl;
         return;
    }
    // 提取值
    auto myValue = myOptionalValue.value();
    /* 你可以在这里对 myValue 做些什么! */
}

或者你可以像这样使用 std::optional<T>::value_or() 给出值或默认值:

value_or_example.cpp
#include <optional> // std::optional
#include <iostream> // std::cerr, std::endl

using namespace std;

std::optional<double> myOptionalFunction() {
    /* 你的代码放在这里! */
}

int main() {
    auto myOptionalValue = myOptionalFunction;
    const double defaultValue = 0.0;
    // 如果 myOptionalFunction() 返回 <无值>,则值将为 0.0
    auto myValue = myOptionalValue.value_or(defaultValue);
    /* 你可以在这里对 myValue 做些什么! */
}

Check out similar posts by category: C/C++