00001 00006 #ifndef ANY_HXX 00007 #define ANY_HXX 00008 00009 #include"any.hh" 00010 #include"bad_any_cast.hh" 00011 #include"internal/value.hh" 00012 00013 namespace my_lib { 00014 00015 template<typename T> 00016 any::any(const T& t) : val(new internal::Value<T>(t)) {} 00017 00018 any::any(const any& a) : val(a.val->clone()) {} 00019 00020 template<typename T> 00021 any& any::operator =(const any& t) { 00022 if(&t==this) return *this; 00023 delete val; 00024 val=t.val->clone(); 00025 } 00026 00027 template<typename T> 00028 any& any::operator =(const T& t) { 00029 delete val; 00030 val=new internal::Value<T>(t); 00031 } 00032 00033 any::~any(){ 00034 delete val; 00035 } 00036 00037 std::ostream& operator<<(std::ostream& o, const any& a){ 00038 return a.val->output(o); 00039 } 00040 00041 template<typename T> 00042 bool any_typeof(const any& a){ 00043 return typeid(internal::Value<T>&)==typeid(*(a.val)); 00044 } 00045 00046 template<typename T> 00047 T any_cast(const any& a){ 00048 try{ 00049 const internal::Value<T>& test=dynamic_cast<const internal::Value<T>&>(*(a.val)); 00050 return test.val; 00051 } catch(std::bad_cast& e){ 00052 throw bad_any_cast("bad_any_cast"); 00053 } 00054 } 00055 00056 }//fin my_lib 00057 00058 #endif //ANY_HXX