diff --git a/14_optional/CMakeLists.txt b/14_optional/CMakeLists.txt new file mode 100644 index 0000000..7424cfe --- /dev/null +++ b/14_optional/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.16.3) + +project(14_optional) + +add_compile_options(-std=c++17) +add_executable(main main.cpp) diff --git a/14_optional/README.md b/14_optional/README.md new file mode 100644 index 0000000..bd72878 --- /dev/null +++ b/14_optional/README.md @@ -0,0 +1,10 @@ +# 14_optional + +変数に値が格納されているかどうかを調べることができるクラス + +ROSなどのコールバック関数で値が格納されているかどうかを確認する際にも利用できる + +C++17以降で利用可能なので注意すること + +参考: +- https://cpprefjp.github.io/reference/optional/optional.html diff --git a/14_optional/main.cpp b/14_optional/main.cpp new file mode 100644 index 0000000..887aae8 --- /dev/null +++ b/14_optional/main.cpp @@ -0,0 +1,42 @@ +// Copyright 2024 AMSL + +#include +#include + +int main(int argc, char **argv) +{ + std::optional num; + if (!num.has_value()) + { + std::cout << "値が含まれていません。" << std::endl; + } + // 値が含まれていないので値の取得もできない + try + { + std::cout << num.value() << std::endl; + } + catch (std::bad_optional_access &e) + { + std::cout << "例外: " << e.what() << std::endl; + } + + num = 1; + if (num.has_value()) + { + std::cout << "値が含まれています。値: " << num.value() << std::endl; + } + + num.reset(); + if (!num.has_value()) + { + std::cout << "値が含まれていません。" << std::endl; + } + + // std::optionalではstd::nulloptを無効値として扱う + num = std::nullopt; // std::nulloptを使ってリセット + if (!num.has_value()) + { + std::cout << "有効値が含まれていません。" << std::endl; + } + return 0; +}