私が考えることができる最も単純な例:
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
これには、動的メモリ割り当て、所有権の心配などが必要です。常に、上記の他の2つのシグネチャのいずれかを優先してください。
もう一つの例:
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
(またはそうでない)のすべての可能な組み合わせをとる4つの関数オーバーロードを持つよりもはるかに理にかなっています!
また、排除呪わ「合格-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
基本的に行動し、使用量の面で同じになります。