std::optional のメンバー関数の中には has_value という空でない値があるかチェックする関数があります。
具体的には 文脈変換 をするための演算子オーバーロードとヘルパー関数の 2 種類があります。
constexpr explicit operator bool() const noexcept; constexpr bool has_value() const noexcept;
前者は bool 値が想定される条件式において、値が空であれば false を返し、そうでなければ true を返します。
後者はメンバー関数と呼び出し、値が空であれば false を返し、そうでなければ true を返します。
では実装例を見てみましょう。
main.cpp.
1 #if __cplusplus < 201703L 2 # pragma message "-std=c++17を指定してください" 3 #endif 4 5 #include <optional> 6 #include <iostream> 7 8 struct Foo { 9 int x; 10 }; 11 12 int main() 13 { 14 Foo foo{20}; 15 16 auto afoo = std::optional<Foo>(foo); 17 afoo = {}; 18 19 if(afoo) 20 std::cout << afoo->x << '\n'; 21 22 if(afoo.has_value()) 23 std::cout << afoo->x << '\n'; 24 else 25 std::cout << "no value" << '\n'; 26 27 return 0; 28 }
ビルドと出力.
$ g++ main.cpp -std=c++17 $ ./a.out no value
まずは初期化です。
16 auto afoo = std::optional<Foo>(foo); 17 afoo = {};
afoo にはオブジェクトが無く空の状態です。
次に 文脈変換 の処理をします。
19 if(afoo) 20 std::cout << afoo->x << '\n';
afoo は演算子オーバーロードによって false に変換されます。
最後に has_value メンバー関数を使ってみます。
22 if(afoo.has_value()) 23 std::cout << afoo->x << '\n'; 24 else 25 std::cout << "no value" << '\n';
has_value は afoo が値のない空の状態のため false を返します。
Copyright 2017-2018, by Masaki Komatsu