참고 : 씹어먹는 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

+ Recent posts

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });