Boost 라이브러리는 C++ 개발자에게 방대한 범위의 기능을 제공하는 대표적인 오픈소스 라이브러리입니다. 그중 any 데이터 타입은 하나의 변수에 어떤 타입의 값이든 저장할 수 있게 해주는 강력한 기능입니다.
자바스크립트나 파이썬처럼 동적 타이핑을 지원하는 언어에서는 이런 유연한 데이터 타입을 기본적으로 사용할 수 있습니다. 하지만 정적 타입 언어인 C++에서는 표준 문법만으로는 불가능하며, Boost 라이브러리의 boost::any를 통해서만 이 기능을 구현할 수 있습니다.
boost::any의 기본 사용법
boost::any 타입의 변수를 선언하면 정수, 문자, 문자열, 실수 등 모든 타입의 값을 자유롭게 대입할 수 있습니다. 저장된 값을 다시 꺼낼 때는 boost::any_cast<T>() 함수를 사용해 원래의 타입으로 변환해야 합니다.
만약 저장된 타입과 다른 타입으로 캐스팅하려고 하면 boost::bad_any_cast 예외가 발생하므로, 반드시 예외 처리를 함께 작성하는 것이 안전합니다.
예제 코드
#include "boost/any.hpp"
#include <bits/stdc++.h>
using namespace std;
int main() {
// any 타입 변수 선언
boost::any x, y, z, a;
x = 20; // 정수 저장
cout << "x : " << boost::any_cast<int>(x) << endl;
y = 'A'; // 문자 저장
cout << "y : " << boost::any_cast<char>(y) << endl;
z = string("Hello World"); // 문자열 저장
cout << "z : " << boost::any_cast<string>(z) << endl;
a = 45.28; // double 저장
cout << "a : " << boost::any_cast<double>(a) << endl;
// 잘못된 타입 변환 시 예외 처리
try {
boost::any n = 1;
cout << boost::any_cast<float>(n) << endl;
}
catch (boost::bad_any_cast& e) {
cout << "Exception Caught : " << e.what() << endl;
}
}실행 결과
x : 20 y : A z : Hello World a : 45.28 Exception Caught : boost::bad_any_cast: failed conversion using boost::any_cast
주요 포인트 정리
- 유연한 저장: boost::any 변수에는 int, char, string, double 등 어떤 타입의 값이든 대입할 수 있습니다.
- 타입 변환: 저장된 값을 사용하려면 boost::any_cast<타입>()으로 명시적으로 변환해야 합니다.
- 예외 처리: 정수 1을 float으로 캐스팅하는 것처럼 호환되지 않는 변환을 시도하면 boost::bad_any_cast 예외가 발생하므로 try-catch 블록으로 처리해야 합니다.
참고로 C++17부터는 이 기능이 표준 라이브러리에 std::any라는 이름으로 포함되었으므로, 최신 컴파일러 환경이라면 별도의 Boost 설치 없이도 동일한 기능을 사용할 수 있습니다.