C++ 標準::オプション

C Biao Zhun Opushon



「std::optional」機能は C++17 で提供されます。 「std::optional」により、オプションの値のタイプセーフな表現、または値を持つことの選択が可能になります。 「std::optional」というテンプレート クラスには、有効な値が含まれる場合と含まれない場合があるオプションの値が含まれています。これは、生のポインターや他の手法よりも、空の値またはオプションの値を表すためのより安全な代替手段です。 「std::optional」は、値を取得する前に値が存在するかどうかを明示的に確認することをユーザーに要求することで、null ポインター逆参照エラーの可能性を最小限に抑えます。

例 1:

「オプション」および「iostream」ヘッダー ファイルは、このコードでインポートされます。これらのヘッダー ファイルに定義されている関数に簡単にアクセスできるように、これらのヘッダー ファイルをインポートする必要があります。この後、「名前空間 std」を含めるので、「std::optional」や「std::cout」などの関数を個別に入力する必要がありません。ここでは「名前空間 std」を使用します。そこで、「std」と入力せずに「optional」または「cout」を配置します。

次に、main() を呼び出して「optional」を配置し、「int」に設定して「myNum」を宣言します。 「std::optional」変数を宣言する構文です。次に、「value」という名前の別の変数を初期化し、value_or() 関数を利用して「myNum」変数に値を割り当てます。この関数では「99」を渡すため、値が存在しない場合はこの「99」を「muNum」変数に代入し、「value」変数に格納します。次に、その下に「cout」を配置します。これは、その上の変数に割り当てた値を表示するのに役立ちます。







コード 1:

#include <オプション>

#include

名前空間 std を使用する ;

整数 主要 ( {

オプション < 整数 > 私の番号 ;

整数 価値 = 私の番号。 値または ( 99 ;

コート << 'myNum の値は次のとおりです:' << 価値 << 終わり ;

戻る 0 ;

}

出力:



ここでは、「99」が表示されていることがわかります。これは、値が上に存在せず、追加した値がその変数に割り当てられていることを意味します。







例 2:

まずヘッダー ファイルをインクルードし、「名前空間 std」を配置します。ここで、この下で「divideFunc()」である「std::optional」関数を宣言します。 「配当」と「除数」は、この関数の 2 つのパラメータです。次に、その下の「if」を使用して、「divisor != 0」という条件を追加します。これを満たしていれば、この中に「return」を追加して、この割り算の答えを返します。それ以外の場合は、安全な型の値がないことを意味する「nullopt」を返します。ここで、main() を呼び出します。 「std::optional」を推論するには、「divideFunc()」を配置し、そこに「27, 3」を追加し、その結果を「quotient」変数に代入します。

ここでは、「auto」キーワードを使用して、データ型を自動的に調整します。この後、type-value を受け取るかどうかを決定する「has-value」を利用する「if」を追加します。次に、「quotient」変数に格納されている結果をレンダリングする「cout」を配置し、「else」部分には除数がゼロであることをレンダリングするステートメントが含まれています。



コード 2:

#include

#include <オプション>

名前空間 std を使用する ;

オプション < 整数 > 分割関数 ( 整数 配当 整数 ディバイダー {

もし ( ディバイダー != 0 {

戻る 配当 / ディバイダー ;

}

戻る ヌルロプト ;

}

整数 主要 ( {

自動 = 分割関数 ( 27 3 ;

もし ( 商。 has_value ( {

コート << 「商は次のとおりです。」 << 商。 価値 ( << 終わり ;

} それ以外 {

コート << 「ここでは約数はゼロです」 << 終わり ;

}

戻る 0 ;

}

出力:

出力は除算後の結果をレンダリングします。これは、除数がゼロではないことを意味します。この例では、「std::optional」を使用して、値が存在するかどうかをタイプセーフに判断します。

例 3:

ここでは、main() 内の「数値」である「std::optional」変数を宣言しています。次に、この「number」変数を含む has_value() 関数を配置する「if」を利用します。この「number」変数に値があるかどうかを確認します。 「number」変数に値が含まれている場合、「if」の後に追加したステートメントが表示されます。それ以外の場合は、「else」の後に配置したステートメントがレンダリングされます。

ここで、「数値」を「92」で初期化し、その下で再度「if」を使用します。ここで、「条件としての場合」に「数値」変数を使用して has_value() 関数が追加されます。これにより、「number」変数に値があるかどうかが決まります。 「if」の後に追加した文は、「number」変数に値がある場合に表示されます。そうでない場合は、「else」の後に配置したステートメントが表示されます。

コード 3:

#include

#include <オプション>

整数 主要 ( {

標準 :: オプション < 整数 > 番号 ;

もし ( 番号。 has_value ( {

標準 :: コート << 「その番号は存在します:」 << 番号。 価値 ( << 標準 :: 終わり ;

} それ以外 {

標準 :: コート << 「その番号は存在しません。」 << 標準 :: 終わり ;

}

番号 = 92 ;

もし ( 番号。 has_value ( {

標準 :: コート << 「その番号は存在します:」 << 番号。 価値 ( << 標準 :: 終わり ;

} それ以外 {

標準 :: コート << 「その番号は存在しません。」 << 標準 :: 終わり ;

}

戻る 0 ;

}

出力:

「std::optional」変数に値を割り当てていないため、これにより最初に「else」部分がレンダリングされます。次に、この変数に値を代入して、その値を次の行に表示します。

例 4:

ここで、「n1」、「n2」、「n3」という 3 つの「std::optional」変数を宣言します。また、値を「n2」変数と「n3」変数 (それぞれ「29」と「45」) に割り当てます。ここでは、「std::optional」クラスの「n1」変数は空です。ここでは、「1」と「0」ではなく「true」または「false」形式で戻り値を返すのに役立つ「boolalpha」を利用します。

この後、これらの「std::optional」変数間の関係演算子を利用し、追加した比較の結果も表示されるように各ステートメントを「cout」内に配置します。まず、「n3 > n2」、次に「n3 < n2」、「n1 < n2」、「n1 == std::nullopt 」であることを確認します。ここで、「nullopt」は、ノーセーフタイプの値またはnullの比較に利用される。次に、「cout」ステートメント内の「n2 == 49」と「n3 == 88」を個別にチェックします。

コード 4:

#include <オプション>

#include

整数 主要 (

{

標準 :: オプション < 整数 > n1 ;

標準 :: オプション < 整数 > n2 ( 29 ;

標準 :: オプション < 整数 > n3 ( 4つ。 ;

標準 :: コート << 標準 :: 英数字 ;

標準 :: コート << 「n3 > n2」 << ( n3 > n2 << 標準 :: 終わり ;

標準 :: コート << 「n3 < n2」 << ( n3 < n2 << 標準 :: 終わり ;

標準 :: コート << 「n1 < n2」 << ( n1 < n2 << 標準 :: 終わり ;

標準 :: コート << 「n1 == null」 << ( n1 == 標準 :: ヌルロプト << 標準 :: 終わり ;

標準 :: コート << 「n2 == 49」 << ( n2 == 29 << 標準 :: 終わり ;

標準 :: コート << 「n3 == 88」 << ( n3 == 88 << 標準 :: 終わり ;

}

出力:

前述の C++ プログラムは、「std::optional」タイプのさまざまな変数値を比較しながら、同時に結果を出力に出力します。

例 5:

このコードに含まれるヘッダー ファイルは、「iostream」、「fstream」、「optional」、「string」です。 「fstream」には、このコードで必要な「ofstream」と「ifstream」の両方の関数の定義が含まれています。ここでは「名前空間 std」を含めるので、関数ごとに個別に配置することはありません。次に、「std:optional」を利用し、引数として「const string& f_Name」を渡す「ReadFileFunc」という名前の関数を宣言します。

次に、「f_name」変数に名前が追加されるファイルの読み取りを支援する「ifstream」があります。次に、ファイルが開かれていない場合は「nullopt」を返すという条件を含む「if」を利用します。これは「if」ステートメントの下に追加したものです。次に、ファイルが開かれている場合にファイルにコンテンツを書き込むのに役立つ「fileContent」という別の関数を作成します。ここで、「return fileContent」を再度配置します。これも、開いた後にファイルに追加したコンテンツを返します。

ここで「main()」を呼び出し、開きたい「Sample.txt」ファイル名で「f_Name」変数を初期化します。次に、ここで「ReadFileFunc()」を呼び出し、この関数に「f_Name」変数を渡します。この関数は、ファイルを読み取り、その内容を「f_content」変数に保存しようとします。この下では、「if」で「f_content」変数を指定した「has_value()」を利用します。この変数に値が含まれている場合は、「if」の下に「cout」を追加し、その中に「f_content」も配置すると、その値も表示されます。それ以外の場合は、「else」の後に追加したエラーが表示されます。

コード5:

#include

#include

#include <オプション>

#include <文字列>

名前空間 std を使用する ;

オプション < > ReadFileFunc ( 定数 & f_Name {

ifstream myFile ( f_Name ;

もし ( 私のファイル。 is_open ( {

戻る ヌルロプト ;

}

文字列ファイルの内容 ( ( isstreambuf_iterator < 文字 > ( 私のファイル isstreambuf_iterator < 文字 > ( ;

戻る ファイルコンテンツ ;

}

整数 主要 ( {

定数 文字列 f_Name = 「サンプル.txt」 ;

自動 f_content = ReadFileFunc ( f_Name ;

もし ( f_コンテンツ。 has_value ( {

コート << 「ファイルの内容は次のとおりです。 \n << f_コンテンツ。 価値 ( << 終わり ;

} それ以外 {

そうですね << 「エラー: ここではファイルが開かれていません」 << f_Name << 終わり ;

}

戻る 0 ;

}

出力:

ここでは、指定されたコードの結果として「else」部分に追加したエラー ステートメントを示しています。

結論

このチュートリアルでは、「std::optional」という強力な C++ 機能を検討し、この機能がオプションの値を表す標準化された方法を提供し、null 参照の要件を排除し、明確さとコードの安全性を強化することを説明しました。また、複雑な問題を説明したり、間違いに優雅に対処したりする能力も向上することがわかりました。