From d76b45638cdfe5dd099711a3fd614f94cf40dcce Mon Sep 17 00:00:00 2001 From: Toshiki Nakamura Date: Tue, 21 May 2024 22:51:41 +0900 Subject: [PATCH] Add 14 --- 14_optional/CMakeLists.txt | 6 ++++++ 14_optional/README.md | 10 +++++++++ 14_optional/main.cpp | 42 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 14_optional/CMakeLists.txt create mode 100644 14_optional/README.md create mode 100644 14_optional/main.cpp 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; +}