7

std::optional を使用していくつかのコードを書いていますが、C++17 の「初期化子を含む if ステートメント」が値のアンパックに役立つかどうか疑問に思っていますか?

std::optional<int> optionalInt = GetOptionalInt();

ここで Unpack 関数を作成しています。

if( auto [value, has_value] = optionalInt.Unpack(); has_value )
{
    // Use value here.
}

しかし、私の質問はです。C++ 17の「初期化子を使用したifステートメント」はここで役立ちますか? もしそうなら、それはどのようにコーディングされますか?

更新、これは実際には主にオプションを使用する場合の問題であり、オプションと*オプションの両方がブール値を返し、誰かが値にアクセスしようとして*を忘れてもコンパイラの警告が表示されないため、誤用が非常に簡単です。

4

3 に答える 3

6

そのような機能はありませんし、あり得ませんUnpack()

しかし、あなたは確かに行うことができます:

if (std::optional<int> o = GetOptionalInt(); o) {
    // use *o here
}

ただし、余分なoチェックは冗長です。


optional<T>これは、多くても 1 つの要素のコンテナーをモデル化すると便利な場所の 1つです。

for (int value : GetOptionalInt()) {
    // possibly not entered
}

しかし、そのインターフェースはありません。

于 2016-09-20T16:24:25.143 に答える