#include <iostream> #include <string> #include <utility> #include <vector> #include "boost/any.hpp" class A { public: void some_function() { std::cout << "A::some_function()\n"; } }; class B { public: void some_function() { std::cout << "B::some_function()\n"; } }; void print_any(boost::any& a) { if (A* pA=boost::any_cast<A>(&a)) { pA->some_function(); } else if (B* pB=boost::any_cast<B>(&a)) { pB->some_function(); } else { try { std::cout << boost::any_cast<std::string>(a) << '\n'; } catch(boost::bad_any_cast&) { std::cout << "Oops!\n"; } } } int main() { std::cout << "Example of using any.\n\n"; std::vector<boost::any> store_anything; store_anything.push_back(A()); store_anything.push_back(B()); // 我们再来,再加一些别的东西 store_anything.push_back(std::string("This is fantastic! ")); store_anything.push_back(3); store_anything.push_back(std::make_pair(true, 7.92)); std::for_each( store_anything.begin(), store_anything.end(), print_any); std::cout << "Example of using any member functions\n\n"; boost::any a1(100); boost::any a2(std::string("200")); boost::any a3; std::cout << "a3 is "; if (!a3.empty()) { std::cout << "not empty\n "; } std::cout << "empty\n"; a1.swap(a2); try { std::string s=boost::any_cast<std::string>(a1); std::cout << "a1 contains a string: " << s << "\n"; } catch(boost::bad_any_cast& e) { std::cout << "I guess a1 doesn't contain a string!\n"; } if (int* p=boost::any_cast<int>(&a2)) { std::cout << "a2 seems to have swapped contents with a1: " << *p << "\n"; } else { std::cout << "Nope, no int in a2\n"; } if (typeid(int)==a2.type()) { std::cout << "a2's type_info equals the type_info of int\n"; } }