64,654
社区成员
发帖
与我相关
我的任务
分享
struct Person
{
string name;
int age;
Person(string name_, int age_)
{
name = name_;
age = age_;
}
};
void MakePersons(vector<Person>& persons)
{
persons.clear();
persons.push_back(Person("Jack", 10));
persons.push_back(Person("Tom", 30));
persons.push_back(Person("Lucy", 15));
}
void ShowPersons(vector<Person>& persons)
{
for (size_t i = 0; i < persons.size(); i++)
{
cout<<"name: "<<persons[i].name.c_str()<<"\t";
cout<<"age: "<<persons[i].age<<endl;
}
}
#include <stdio.h>
struct __meta_base_info_t {
const char *name;
enum meta_type_t{
META_OBJ,
META_MEMBER,
META_METHOD
} type;
__meta_base_info_t *_next;
__meta_base_info_t( const char *n, meta_type_t t ) : name(n), type(t), _next(0) {}
};
struct __meta_obj_info_t : public __meta_base_info_t {
__meta_base_info_t *_head;
__meta_obj_info_t( const char *n )
: __meta_base_info_t(n,__meta_base_info_t::META_OBJ)
, _head(0)
{}
void add_member( __meta_base_info_t*info ) {
if ( this->_head == 0 ) {
this->_head = info;
}
if ( this->_next != 0 ) {
this->_next->_next = info;
}
this->_next = info;
}
bool get_member( void *obj, const char *name, void *data ) const;
bool set_member( void *obj, const char *name, const void *data ) const;
void print() const {
printf( "name : %s\n", this->name );
__meta_base_info_t *hdr = this->_head;
while( hdr != 0 ) {
printf( "\t%s\n", hdr->name );
hdr = hdr->_next;
}
}
};
struct __meta_member_info_t : public __meta_base_info_t {
typedef void (*_getter_t)( void *obj, void *data );
typedef void (*_setter_t)( void *obj, const void *data );
__meta_member_info_t( __meta_obj_info_t &obj_info, const char *n, __meta_member_info_t::_getter_t g, __meta_member_info_t::_setter_t s)
: __meta_base_info_t(n,__meta_base_info_t::META_MEMBER)
, getter(g), setter(s)
{
obj_info.add_member( this );
}
_getter_t getter;
_setter_t setter;
};
bool __meta_obj_info_t::get_member( void *obj, const char *name, void *data ) const {
__meta_base_info_t *hdr = this->_head;
while( hdr != 0 ) {
if ( strcmp( name, hdr->name ) == 0 ) {
reinterpret_cast<__meta_member_info_t*>(hdr)->getter( obj, data );
return true;
}
hdr = hdr->_next;
}
return false;
}
bool __meta_obj_info_t::set_member( void *obj, const char *name, const void *data ) const {
__meta_base_info_t *hdr = this->_head;
while( hdr != 0 ) {
if ( strcmp( name, hdr->name ) == 0 ) {
reinterpret_cast<__meta_member_info_t*>(hdr)->setter( obj, data );
return true;
}
hdr = hdr->_next;
}
return false;
}
#define META_INFO_REGISTER(idx,_register_func)
#define BEGIN_UDT_IMPL( type, name, __ID__ ) type name { \
typedef name __meta__this_t;\
template <typename _Type, int __Idx>\
struct __meta_info_register {\
static void __init__() {\
__meta_info_register<_Type,__ID__+1>::__init__();\
}\
static __meta_obj_info_t &__meta_get_udt_info() { \
static __meta_obj_info_t __info_instance(#name);\
return __info_instance;\
}\
};\
typedef __meta_info_register<__meta__this_t, __ID__> __meta_info_instance__;\
friend __meta_info_register<__meta__this_t, __ID__>;
#define BEGIN_UDT( type, name ) BEGIN_UDT_IMPL(type,name, __COUNTER__)
#define END_UDT() \
template<typename _Type> struct __meta_info_register<_Type,__COUNTER__> {static void __init__() {}};\
public:\
typedef struct { \
static const __meta_obj_info_t &instance() { \
static struct _meta_info_init {_meta_info_init() { __meta__this_t::__meta_info_instance__::__init__(); }} _init;\
return __meta__this_t::__meta_info_instance__::__meta_get_udt_info();\
}\
} _META_INFO_;\
};
#define DEFINE_MEMBER_IMPL( type, name, __ID__ ) type name;\
template<typename _Type> struct __meta_info_register<_Type,__ID__> {\
static void __meta_setter_##name( __meta__this_t*obj, const type &data ) {obj->name = data;}\
static void __meta_getter_##name( __meta__this_t*obj, type &data ) {data = obj->name;}\
static void __meta_register_##name() {static __meta_member_info_t __info_instance(__meta_info_instance__::__meta_get_udt_info(),#name,(__meta_member_info_t::_getter_t)__meta__this_t::__meta_info_register<_Type,__ID__>::__meta_getter_##name,(__meta_member_info_t::_setter_t)__meta__this_t::__meta_info_register<_Type,__ID__>::__meta_setter_##name);}\
static void __init__() { __meta_register_##name(); __meta_info_register<_Type,__ID__+1>::__init__(); }\
};\
friend __meta_info_register<__meta__this_t, __ID__>;
#define DEFINE_MEMBER( type, name) DEFINE_MEMBER_IMPL( type, name, __COUNTER__ )
BEGIN_UDT( struct, test_class )
DEFINE_MEMBER( int, test_member )
END_UDT()
BEGIN_UDT( class, test_class2 )
DEFINE_MEMBER( int, test_member )
DEFINE_MEMBER( int, foo )
DEFINE_MEMBER( int, bar )
END_UDT()
int main(int argc, char* argv[])
{
printf( "sizeof:%d\n", sizeof(test_class) );
test_class::_META_INFO_::instance().print();
test_class2::_META_INFO_::instance().print();
test_class a;
a.test_member = 10;
const char * member_name[] = {
"test_member",
"test_member_xxx",
};
for( int i=0; i<sizeof(member_name)/sizeof(member_name[0]); i++ ) {
const char * name = member_name[i];
int val;
if ( test_class2::_META_INFO_::instance().get_member( &a, name, &val ) ) {
printf( "get member ->%s\t%d\n", name, val );
} else {
printf( "invalid member %s\n", name );
}
}
int new_val = 12;
test_class::_META_INFO_::instance().set_member( &a, "test_member", &new_val );
printf( "set new val %d\n", a.test_member );
return 0;
}
利用了一个非标准扩展实现的自动元数据记录.只有vc和icl以及gcc可以编译.