any — std::any

any — std::any

std::any 클래스는 복사 생성 가능한(copy constructible) 어떤 타입의 단일 값도 타입 안전하게 저장하는 컨테이너를 나타내요. C++17에서 도입됐어요. <any> 헤더에 있어요.

한 객체 안에 임의의 타입 값을 담되, 꺼낼 때 타입을 검사할 수 있어요.

출처: cppreference

본문

// <any> 헤더, C++17
class any;

any 객체는 복사 생성 가능한 타입의 인스턴스 하나를 저장해요.

사용 예

#include <any>
#include <iostream>

std::any a;                 // 비어 있음
a = 42;                     // int 저장
a = std::string("hello");   // string 저장 (타입 변경 가능)

// 타입 안전하게 꺼내기
int n = std::any_cast<int>(a);       // string이 저장돼 있어 실패 → 예외

주의: 이 예에서 astd::string을 담고 있으므로 any_cast<int>는 예외(std::bad_any_cast)가 돼요.

std::any b = 3.14;
double d = std::any_cast<double>(b);   // OK

// 포인터 버전으로 존재 확인
if (auto p = std::any_cast<int>(&b)) {
    // b가 int면 사용, 아니면 null
}

주요 연산

연산 설명
has_value() 값을 담고 있는지
type() 저장된 타입의 type_info
reset() / emplace<T> 값 교체
std::any_cast<T> 타입 안전 추출 (예외/포인터 버전)
std::make_any<T> 생성 도우미
std::any a = std::make_any<std::vector<int>>({1,2,3});
auto& v = std::any_cast<std::vector<int>&>(a);   // 참조로 꺼내기

특징

  • 저장된 타입이 완전히 달라도 "아무 값이나" 담을 수 있어요 (타입을 지우는 컨테이너).
  • 꺼낼 때는 실제 타입과 일치해야 해요 — 불일치 시 예외.
  • 스몰 버퍼 최적화로 작은 값은 힙 할당을 피할 수 있어요.

std::any는 타입이 다양한 값(예: 설정값, 이벤트 페이로드)을 한 컨테이너에 담아야 할 때 유용해요. 형(type)은 보존되므로 안전하게 복원할 수 있어요.

더 알아보기 (Learn more)

cppreference