我正在为游戏引擎编写静态反射库(这是一个空闲时间的个人项目)。请注意,我正在使用C ++ 17。
不是直接存储类成员偏移量,而是使用此模板结构存储成员地址:
template<class ClassType, typename MemberType, MemberType ClassType::*AddressValue>
struct MemberAddress
{
typedef MemberType ClassType::* Type;
static constexpr const Type _value = AddressValue;
};
如何通过仅写入成员地址来重新编写它,以使其自推断ClassType和MemberType?我的意思是,我想写:
struct Vec3 { float x, y, z = 0.f};
typedef MemberAddress<&Vec3::x> MemberAddress_x
代替
typedef MemberAddress<Vec3, float, &Vec3::x> MemberAddress_x
理想情况下,该解决方案还将使用C ++ 14和C ++ 11。
您很幸运拥有C ++ 17,在较早的版本中这是不可能的,因为解决方案取决于auto
模板参数。但是,它看起来像这样:
template<class T, T val>
struct MemberAddrHelper;
template<class ClassType, typename MemberType, MemberType ClassType::*AddressValue>
struct MemberAddrHelper<MemberType ClassType::*, AddressValue> {
typedef MemberType ClassType::* Type;
static constexpr const Type _value = AddressValue;
};
template<auto addr>
using MemberAddr = MemberAddrHelper<decltype(addr), addr>;
struct foo {
int bar;
};
using baz = MemberAddr<&foo::bar>;