boost::any cho phép lưu trữ giá trị của bất kỳ kiểu nào (giống std::any C++17). Cần boost/any.hpp.
Ví dụ mã nguồn
#include <iostream>
#include <boost/any.hpp>
#include <string>
using namespace std;
int main() {
boost::any a, b, c, d;
a = 42; // int
b = 3.14; // double
c = string("Hello"); // string
d = 'Z'; // char
// Truy xuất: phải biết kiểu chính xác
cout << "int: " << boost::any_cast<int>(a) << '\n';
cout << "double: " << boost::any_cast<double>(b) << '\n';
cout << "string: " << boost::any_cast<string>(c) << '\n';
cout << "char: " << boost::any_cast<char>(d) << '\n';
// Sai kiểu -> ném boost::bad_any_cast
try {
cout << boost::any_cast<float>(a); // a là int, không phải float
} catch (const boost::bad_any_cast& e) {
cout << "Loi ep kieu: " << e.what() << '\n';
}
// Kiểm tra kiểu trước khi cast
if (a.type() == typeid(int))
cout << "a la int\n";
return 0;
}
Đầu ra
int: 42 double: 3.14 string: Hello char: Z Loi ep kieu: boost::bad_any_cast: failed conversion using boost::any_cast a la int
So sánh boost::any vs std::any (C++17)
| Đặc điểm | boost::any | std::any |
|---|---|---|
| Tiêu chuẩn | Boost (C++03+) | C++17 |
| Header | <boost/any.hpp> | <any> |
| API | Tương tự | Chuẩn hóa |
Ứng dụng
- Container chứa nhiều kiểu:
vector<boost::any> - Hệ thống plugin, scripting bindings.
- Thay thế union không an toàn kiểu.