#include <iostream> #include <typeinfo> #include <map> #include <string> using namespace std; class IMeta { public: virtual ~IMeta() {} virtual IMeta* clone() = 0; virtual const std::type_info & type() const = 0; virtual ostream& operator<<(ostream& os) = 0; }; template <typename T> class metadata : public IMeta { public: T _data; metadata(const T& t) { _data = t; } IMeta* clone() { return new metadata(_data); } const std::type_info & type() const { return typeid(_data); } ~metadata(){} ostream& operator<<(ostream& os) { os << _data; return os; } }; class any { friend ostream& operator<<(ostream& os, const any& any_obj); public: IMeta* _meta; template<typename T> any(const T& t) :_meta( new metadata<T>(t) ) { } any() : _meta(NULL) { } template<typename T> any& operator=(const T& t) { delete _meta; _meta = new metadata<T>(t); return *this; } any& operator=(const any& a) { if (&a == this) return *this; this->_meta = a._meta->clone(); return *this; } const std::type_info& type() const { return _meta ? _meta->type() : typeid(void); } ~any() { delete _meta; } }; template<typename T> T& any_cast(const any& any_obj) { metadata<T> *pmeta = (metadata<T>*)any_obj._meta; return pmeta->_data; } ostream& operator<<(ostream& os, const any& any_obj) { os << any_obj._meta; return os; } int _tmain(int argc, _TCHAR* argv[]) { map<string, any> people; people["age"] = 3; people["name"] = string("bright"); cout << people["age"] << endl; cout << any_cast<string>(people["name"]) << endl; cout << people["name"].type().name() << endl; // map<string, object> people; // people["age"] = meta<int>(3); // people["name"] = meta<string>("bright"); // cout << static_cast<meta<int> >(people["name"]) << endl; return 0; } 下一步是让它能