вычитание типа шаблона структуры из адреса члена - PullRequest
3 голосов
/ 28 апреля 2020

Я пишу стати c библиотеку отражений для игрового движка (это личный проект в свободное время). Обратите внимание, что я использую 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.

1 Ответ

1 голос
/ 28 апреля 2020

Вам повезло иметь 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>;
...