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이 저장돼 있어 실패 → 예외
주의: 이 예에서 a는 std::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)은 보존되므로 안전하게 복원할 수 있어요.