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