magic_get编译期反射的局限性
magic_get可以实现编译期获取pod类型,是以一种“无痕”的方式实现的,即无需宏、特殊标记、专门工具。看起来确实很精妙,不过也存在一些局限性,比如只能支持pod类型,不能获取反射类型的字段名,也不支持遍历访问对象字段。这些局限性导致magic_get无法在更广泛的环境下应用。
一种更通用的编译期反射方法
基本的反射功能应该包括根据索引获取字段,根据索引获取字段名,遍历对象的所有字段,支持所有类型的对象。
一种更通用的编译期反射应该支持下面这些。
struct city_t
{
int id;
double num;
};
REFLECTION(city_t, id,num);
struct person_t
{
int id;
double num;
city_t city;
};
REFLECTION(person_t, id,num,city);
int main()
{
city_t city = {20, 3.5};
person_t p = {1,2.5,city};
//get filed name by index
constexpr auto filed_name = get_name<person_t, 1>();
//get value by index
auto val = get<1>(p);
//apply algorithm to every member of struct
for_each(p, [](auto& v, size_t I)
{
v*=10;