std::any

2023. 1. 8. 12:36Programming/JAVA, C++, Go, Rust

    목차
반응형

std::any

C++에서 std::any는 어떠한 type의 값이라도 상관없이 저장할 수 있도록 만든 template class type의 변수 입니다.
C++17부터 지원하기 시작했으며, 이제 이를 사용하면 기존에 variant type을 만들어서 사용하던 수고를 덜 수 있습니다. (많은 C++ project에서 variant type을 만들었었고, Qt와 같은 framework에서도 variant type을 지원하곤 했죠)

사용 방법

std::any는 간단히 사용할 수 있습니다.
먼저 any라는 헤더 파일을 include 합니다.

이후 다음과 같이 변수를 선언합니다.

    std::any val;

    std::cout<<(val.has_value() ? "has value" : "no value")<<std::endl;
    //std::cout<<val.type().name<<std::endl;

    val = std::string("test");

    std::cout<<(val.has_value() ? "has value" : "no value")<<std::endl;

    auto type_name = val.type().name();
    std::cout<<"type: "<<type_name<<"\n";

    val.reset();

    std::cout<<(val.has_value() ? "has value" : "no value")<<std::endl;


    std::any val3 = std::make_any<std::string>("test2");
    std::string strval3 = std::any_cast<std::string>(val3);

    std::cout<<strval3<<std::endl;

std::any val;
이런식으로 비어있는 any type의 변수를 선언할 수 있습니다.

그러나 다음과 같이 make_any를 사용하는 것을 권장합니다.

std::any val = std::make_any<std::string>("value");

값 유무 check

any 변수가 값을 지니고 있는지 여부를 확인하려면, has_value 메소들 사용합니다.

if (true == val.has_value()) {
    ... has value...
}

값을 가지고 있지 않을 때 값을 가져오는 연산을 수행하면 exception이 발생합니다.
값이 있는 것을 확인 한 후, value 메소드를 사용해 값을 가져옵니다.

std::string str_val = val.value();
반응형

'Programming > JAVA, C++, Go, Rust' 카테고리의 다른 글

unordered_map vs. map  (0) 2023.01.25
std::copy  (0) 2023.01.13
C++: set 사용하기  (0) 2022.10.08
C++ set 사용법  (0) 2022.10.08
C++ file path (파일 경로) 획득 방법  (0) 2022.10.04