我能想到的最简单的示例:
std::optional<int> try_parse_int(std::string s)
{
//try to parse an int from the given string,
//and return "nothing" if you fail
}
相同的事情可以通过引用参数来代替(如下面的签名所示),但是使用std::optional
可以使签名和用法更好。
bool try_parse_int(std::string s, int& i);
可以这样做的另一种方法特别糟糕:
int* try_parse_int(std::string s); //return nullptr if fail
这需要动态的内存分配,担心所有权等问题-总是更喜欢上面的其他两个签名之一。
另一个例子:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
相std::unique_ptr<std::string>
对于每个电话号码都带有一个类似的字母,这是非常可取的!std::optional
为您提供数据局部性,这对于提高性能非常有用。
另一个例子:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
如果查找中没有特定的键,那么我们可以简单地返回“无值”。
我可以这样使用它:
Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");
另一个例子:
std::vector<std::pair<std::string, double>> search(
std::string query,
std::optional<int> max_count,
std::optional<double> min_match_score);
这比说有四个函数重载要花费max_count
(或不)和min_match_score
(或不)的每种可能组合要有意义得多!
它也消除了诅咒 “通过-1
了max_count
,如果你不想限制”或“通行证std::numeric_limits<double>::min()
的min_match_score
,如果你不想要一个最低分”!
另一个例子:
std::optional<int> find_in_string(std::string s, std::string query);
如果查询字符串不在中s
,则我希望“否int
”- 而不是有人为此目的使用的任何特殊值(-1?)。
有关其他示例,请参阅boost::optional
文档。boost::optional
并且std::optional
在行为和用法方面基本相同。