快速提示:如何从函数返回 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++
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow