[解決済み] std::optionalはどのように使うべきですか?
質問
のドキュメントを読んでいます。
std::experimental::optional
が何をするものなのかがよくわからないのです。
いつ
どう使えばいいのか、どう使えばいいのか。このサイトにはまだ例が載っていないので、このオブジェクトの本当のコンセプトを把握するのが難しいのです。というのは
std::optional
を使うのが良い選択なのか、以前の標準(C++11)になかったものをどのように補っているのか。
どのように解決するのか?
最もシンプルな例を挙げます。
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);
のすべての可能な組み合わせを取る4つの関数のオーバーロードを持つよりも、ずっと理にかなっています。
max_count
(ない場合もある)と
min_match_score
(または、そうでない)!
また
排除する
は
呪われた
パス
-1
のために
max_count
制限を設けない場合"または"Pass
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
は、動作や使い方が基本的に同じになります。
関連
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】変数やフィールドがvoid宣言されている