C++ でバイナリイメージと type_info から型を (変換しながら) 組み立て
動いた。coderepos に上げた (http://coderepos.org/share/browser/lang/cplusplus/reflection/trunk/memrebuild.hpp)
こんな感じでいいんじゃないかな。まだコンパイルしてないけど。
template <typename T> struct instantiator { virtual ~instantiator() {} T (*get(const std::type_info &))(const void*) = 0; }; template <typename Target, typename Source> struct instantiator_t : public instantiator<Target> { Target (*get(const std::type_info &t))(const void *) { if (typeid(Source) != t) return NULL; return instantiate; } static Target instantiate(const void *p) { return intelligent_cast<Target>(*reinterpret_cast<const Source*>(p)); } }; template <typename T> class instantiator_map : public std::vector<instantiator*> { static instantiator_map<T> m; instantiator_map() { push_back(new instantiator_t<T, T>()); } }; template <typename T,typename U,bool Skip=boost::is_same<T,U>::value> struct add_convert_instantiator { add_convert_instantiator() { instantiator_map<T>::m.push_back(new instantiator<T,U>()); } }; template <typename T, typename U> struct add_convert_instantiator<T,U,true> { add_convert_instantiator() {} }; template <typename T> class def_instantiator_map : public std::vector<instantiator*> { static instantiator_map<T> m; instantiator_map() { push_back(new instantiator_t<T, T>()); add_convert_instantiator<T,char>(this); add_convert_instantiator<T,short>(this); ... } }; template <> struct instantiator_map<char> : public def_instantiator_map<char> {}; template <> struct instantiator_map<short> : public def_instantiator_map<short> {}; ... template <typename T> T reconstruct(const void* p, const std::type_info& t) { for (instantiator_map<T>::const_iterator = instantiator_map<T>::m.begin(); i != instantiator_map<T>::m.end(); ++i) { T (*instantiate)(const void *); if ((instantiate = i->get(t, typeid(T))) != NULL) return (*instantiate)(p); } throw bad_cast_exception; }