참고 : 씹어먹는 C++ - <17 - 5. C++ 17 의 std::optional, variant, tuple 살펴보기>
optional
std::optional
c++17 이상
원하는 값을 보관할 수 도, 안할 수 도 있는 클래스
일반적으로 레퍼런스 보관 불가
사용 예시
std::optional<std::string> GetValue(int a) { if (a > 0) { return "sfsfs"; } // nullopt 는 <optional> 에 정의된 객체로 비어있는 optional 을 의미한다. return std::nullopt; } int main() { std::cout << "값이 있으면 제대로 출력 " << GetValue(3).value() << std::endl; std::cout << "값 있는지 확인, 2방식 동일 " << std::boolalpha << GetValue(-4).has_value() << GetValue(-4) << std::endl; // (bool 반환이 기본이기에) std::cout << "값 없으면 지정한 기본 값 출력 " << GetValue(-4).value_or(3) << std::endl; // 기본값 타입은 optional 타입과 동일해야 함 }
레퍼런스 우회 보관방법 (
std::reference_wrapper
사용)#include <functional> #include <iostream> #include <optional> #include <utility> class A { public: int data; }; int main() { A a; a.data = 5; // maybe_a 는 a 의 복사복이 아닌 a 객체 자체의 레퍼런스를 보관하게 된다. std::optional<std::reference_wrapper<A>> maybe_a = std::ref(a); maybe_a->get().data = 3; // 실제로 a 객체의 data 가 바뀐 것을 알 수 있다. std::cout << "a.data : " << a.data << std::endl; }
variant
std:variant
c++17 이상
one-of 를 구현
정의할 때 포함하고자 하는 타입들을 명시
반드시 값을 들고 있어야 한다
std::monostate
를 통해, 피해갈 수 있음
같은 타입 중복 사용 불가
사용 예시
std::variant<int, std::string, double> v;
'공부 > C++' 카테고리의 다른 글
상속 (0) | 2025.03.07 |
---|---|
foreach 방식 (범위 기반 for 문) (0) | 2025.03.05 |
(C++17,20)구조적 바인딩 (0) | 2025.03.05 |
튜플(Tuple) (0) | 2025.03.05 |
클래스 (0) | 2025.03.03 |