one header tiny C++ type meta-information library for reflection and serialization for classes, functions, types
- single header
- no external dependencies except for small set of C++98 std library headers
- terms used for registering and retrieving meta-information are standard complient
#include <cppmeta.hpp>
struct type_for_ct_reflection
{
type_for_ct_reflection() {}
type_for_ct_reflection(int, float) {}
type_for_ct_reflection(int, int) {}
int data1;
void func1(float) {}
template<class T>
void templ_func1(T) {}
};
template<>
struct cppmeta::reflect<type_for_ct_reflection, cppmeta::reflection::compile_time>
{
template<class meta_info>
void operator()() const
{
cppmeta::reflect<type_for_ct_reflection>::
name = "type_for_ct_reflection",
members =
member("type_for_ct_reflection()", &class_<type_for_ct_reflection>::default_constructor),
member("type_for_ct_reflection(int, float)", &class_<type_for_ct_reflection>::constructor<int, float>),
member("constructor2", &class_<type_for_ct_reflection>::constructor<int, int>),
member("~type_for_ct_reflection", &class_<type_for_ct_reflection>::destructor),
member("data1", &type_for_ct_reflection::data1),
member("func1", &type_for_ct_reflection::func1),
member("templ_func1(int)", &type_for_ct_reflection::templ_func1<int>)
;
}
};
int some_data_ct;
template<>
struct cppmeta::reflect_ct<int>
{
template<class meta_info>
void operator()() const
{
meta_info::
objects +=
object("some_data_ct", &some_data_ct);
;
}
};
using namespace cppmeta;
int type_for_ct_reflection::* data1_tmp =
resolve<type_for_ct_reflection>::member<int>("data1").value;
type_for_ct_reflection obj;
obj.data1 == obj.*data1_tmp; // true
#include <cppmeta.hpp>
struct type_for_rt_reflection
{
type_for_rt_reflection() {}
type_for_rt_reflection(int, float) {}
type_for_rt_reflection(int, int) {}
int data1;
void func1(float) {}
template<class T>
void templ_func1(T) {}
};
struct type_for_rt_reflection_child
: type_for_rt_reflection
{
int data2;
};
int some_data_rt = 0;
const int some_data_rt_const = 0;
enum enum_for_rt_reflection
{
rt_1,
rt_2
};
void MyCode()
{
using namespace cppmeta;
reflect<type_for_rt_reflection>::
name = "type_for_rt_reflection",
members =
member("type_for_rt_reflection()", &class_<type_for_rt_reflection>::default_constructor)
,member("data1", &type_for_rt_reflection::data1)
;
reflect<type_for_rt_reflection_child>::
name = "type_for_rt_reflection_child",
members =
member("type_for_rt_reflection_child()", &class_<type_for_rt_reflection_child>::default_constructor)
, member("data2", &type_for_rt_reflection_child::data2)
, reflect<type_for_rt_reflection>::members // add parent members to child (optional)
;
reflect<int>::
objects +=
object("some_data_rt", &some_data_rt)
, object("some_data_rt_ref", some_data_rt)
, object("some_data_rt_const", some_data_rt_const)
,values +=
constant("max_int", 2048)
;
reflect<enum_for_rt_reflection>::
name = "enum_for_rt_reflection",
values =
constant("rt_1", rt_1),
constant("rt_2", rt_2)
;
}
int type_for_rt_reflection::* data1_tmp =
resolve<type_for_rt_reflection>::member<int>("data1").value;
type_for_rt_reflection obj;
obj.data1 == obj.*data1_tmp; // true
int type_for_rt_reflection_child::* child_data1_tmp =
resolve<type_for_rt_reflection_child>::member<int>("data1").value;
type_for_rt_reflection_child obj_child;
obj_child.data1 == obj_child.*child_data1_tmp; // true
int some_data_rt_resolved =
resolve<int>::object("some_data_rt").value;
const int& some_data_rt_resolved =
resolve<int>::object("some_data_rt_const").value;
const int& some_data_rt_const_resolved =
resolve<const int>::object("some_data_rt").value;
const int& some_data_rt_const_resolved =
resolve<const int>::object("some_data_rt_const").value;
int& some_data_rt_ref_resolved =
resolve<int&>::object("some_data_rt").value;
some_data_rt_ref_resolved = 42; // changes `some_data_rt`
const int& some_data_rt_ref_const_resolved =
resolve<const int&>::object("some_data_rt_const").value;
int* some_data_rt_ptr_resolved =
resolve<int*>::object("some_data_rt").value;
(*some_data_rt_ref_resolved) = 42; // changes `some_data_rt`
const int* some_data_rt_ptr_const_resolved =
resolve<const int*>::object("some_data_rt_const").value;
const int& max_int_const =
resolve<const int>::constant("max_int").value;
const enum_for_rt_reflection& rt_1_const =
resolve<enum_for_rt_reflection>::value("rt_1").value;
// in progress