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;
}