optional値へのアクセス
value_orとhas_valueを使用します
「optional値へのアクセス」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
デリファレンス演算子
optionalを読み取る最も速い方法は*optですが、値を保持していると確信できる場合に限ります。チェックは行われません。
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 10;
if (o) std::cout << *o << "\n";
}value()メソッド
opt.value()は値を返しますが、optionalが空の場合はstd::bad_optional_accessを送出します。空のoptionalを実際のエラーとして扱う場合に使用してください。
#include <iostream>
#include <optional>
int main() {
std::optional<int> o;
try { std::cout << o.value() << "\n"; }
catch (const std::bad_optional_access&) { std::cout << "empty!\n"; }
}デフォルト値のvalue_or
opt.value_or(fallback)は、値があれば保持された値を返し、なければfallbackを返します。分岐も例外も必要ありません。
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = std::nullopt;
std::cout << o.value_or(-1) << "\n"; // -1
}実際のデータでvalue_orを使う
よくある用途は、存在しない設定値や検索結果にデフォルト値を指定することです。
#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> lookup(bool found) {
if (found) return std::string("Pro");
return std::nullopt;
}
int main() {
std::cout << lookup(false).value_or("Free") << "\n";
}アロー演算子
クラス型のoptionalでは、opt->memberを使ってメンバーに直接アクセスできます(この場合も空でないことが前提です)。
#include <iostream>
#include <optional>
#include <string>
int main() {
std::optional<std::string> o = std::string("hello");
if (o) std::cout << o->size() << "\n";
}アクセス前にガードする
安全なイディオムは、確認してから使用することです。確認とアクセスを組み合わせることで、例外と未定義の動作の両方を避けられます。
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 7;
if (o.has_value()) {
int x = *o;
std::cout << x * 2 << "\n";
}
}if文の初期化ステートメント
if文の初期化ステートメントを使うと、1行で宣言と確認を行えます。optionalのスコープも分岐内に限定できます。
#include <iostream>
#include <optional>
std::optional<int> find() { return 3; }
int main() {
if (auto v = find(); v.has_value())
std::cout << *v << "\n";
}Transform(C++23)
transformのようなモナディックヘルパーは、値が存在する場合にだけ関数を適用し、新しいoptionalを返します。これにより、計算をすっきり連結できます。
and_thenによる連結
and_then(C++23)は、それ自体がoptionalを返す関数を呼び出し、結果を平坦化します。各ステップが失敗する可能性がある処理に適しています。
アクセサーを選ぶ
妥当なデフォルト値がある場合はvalue_orを、空であることを例外として扱うべき場合はvalue()を、明示的なチェックの後だけ*または->を使用してください。
チェックなしのデリファレンスを避ける
optionalが空でないことを確認せずに、*optを決して呼び出さないでください。これは未定義の動作であり、クラッシュのよくある原因です。
理解度チェック
optionalへのアクセスについての理解を確認しましょう。
まとめ
optionalへのアクセス方法として、次のことを学びました:
- チェック後に
*と->を使用します。 value()は空の場合に例外を送出します。value_orはデフォルト値を指定します。- モナディックな
transformとand_thenで操作を連結できます(C++23)。
よくある質問
「optional値へのアクセス」レッスンは無料ですか?
はい。「optional値へのアクセス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「optional値へのアクセス」で何を学びますか?
value_orとhas_valueを使用します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「optional値へのアクセス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- optionalによる値の不在の表現
- optional値へのアクセス
- std::expectedの基礎
- エラー処理パターン