从成员地址推导的结构模板类型

问题描述 投票:3回答:1

我正在为游戏引擎编写静态反射库(这是一个空闲时间的个人项目)。请注意,我正在使用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++ templates template-meta-programming type-deduction
1个回答
0
投票

您很幸运拥有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>;
© www.soinside.com 2019 - 2024. All rights reserved.