Show
Ignore:
Timestamp:
07/03/08 16:13:48 (6 months ago)
Author:
kazuho
Message:

add getter()

Location:
lang/cplusplus/reflection/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/cplusplus/reflection/trunk/memrebuild.hpp

    r14745 r15103  
    119119 
    120120#undef MEM_REBUILD_ 
    121  
    122   template <typename T, typename TI> T core(const void *p, TI t) 
     121   
     122  template <typename T, typename TI> 
     123  typename builder<T>::func_t get_instantiator(TI t) 
    123124  { 
    124     typedef mem_rebuild_ns::builder_map<T> map; 
    125     for (typename map::const_iterator i = map::m.begin(); 
    126          i != map::m.end(); 
     125    for (typename builder_map<T>::const_iterator i = builder_map<T>::m.begin(); 
     126         i != builder_map<T>::m.end(); 
    127127         ++i) { 
    128128      typename mem_rebuild_ns::builder<T>::func_t instantiate; 
    129129      if ((instantiate = (*i)->get(t)) != NULL) 
    130         return (*instantiate)(p); 
     130        return instantiate; 
    131131    } 
    132132    throw std::bad_cast(); 
     133  } 
     134   
     135  template <typename T, typename TI> T core(const void *p, TI t) 
     136  { 
     137    return (*get_instantiator<T, TI>(t))(p); 
    133138  } 
    134139 
  • lang/cplusplus/reflection/trunk/reflection.hpp

    r14887 r15103  
    1010namespace reflection { 
    1111   
     12  template <class T, typename Vt> struct member_getter { 
     13    Vt (*f)(const void*); 
     14    char T::*p; 
     15    member_getter(Vt (*_f)(const void*), char T::*_p) : f(_f), p(_p) {} 
     16    T operator()(const T &obj) { 
     17      return (*f)(obj.*p); 
     18    } 
     19  }; 
     20   
    1221  template <class T> struct member : public mem_rebuild_ns::type_is_t { 
    1322    virtual ~member() {} 
     
    1928    template <typename Vt> Vt get(const T &obj) const { 
    2029      return mem_rebuild<Vt>(&(obj.*ptr()), this); 
     30    } 
     31    template <typename Vt> member_getter<T, Vt> getter() const { 
     32      return member_getter<T, Vt>(mem_rebuild_ns::get_instantiator<Vt>(this), 
     33                                  ptr()); 
    2134    } 
    2235    template <typename Vt> void set(T &obj, const Vt &v) const {