Реальное использование списков типов шаблонов C ++ - PullRequest
0 голосов
/ 08 мая 2020

Я создал список типов вариантов c шаблонов

template <typename... Types>
struct type_list
{
};

и некоторые функции модификаторов, такие как push_back

template <class TypeList, typename PushBack>
struct push_back
{
};

template <template<typename...> class TypeList, typename... Types, typename PushBack>
struct push_back<   TypeList<Types...>, PushBack    >
{
   using type = TypeList<Types..., PushBack>;
};

template <class TypeList, typename PushBack>
using push_back_t = typename push_back<TypeList, PushBack>::type;

Теперь я хочу использовать type_list в рамках настраиваемого stati c библиотека отражения для хранения всей мета-структуры, содержащей информацию о переменных-членах (имя, размер, тип, адрес). Например:

#define DECLARE_VARIABLE_INFO(VariableName) \
    using VariableName##_TypeInfo = VariableInfo<decltype(VariableName), VariableName##_Name, MemberAddress<&ClassType::VariableName>>; \
    *** What to put here to reuse the existing type_list without redefining a new list ***
    *** I could write using VariableName##_PushBack = push_back_t<MemberList, VariableName##_TypeInfo>; but MemberList will still be empty ***

struct Vec3
{
    float x, y, z = 0.f
    struct Vec3_Info // hold class meta info
    {
        using MemberList = meta_list::type_list<>;

        DECLARE_VARIABLE_INFO(x); // x_PushBack is there but MemberList is empty
        DECLARE_VARIABLE_INFO(y); // y_PushBack is there but it doesn't hold x meta info and MemberList is empty
        DECLARE_VARIABLE_INFO(z); // z_PushBack is there but it doesn't hold x and y meta infos and  MemberList is empty
    };
};

Я не могу понять, как заполнить существующий type_list без переопределения новых типов. Можно ли это сделать?
Я использую не тот инструмент? Или я плохо использую правильный инструмент?
Прошу прощения, это, наверное, глупый вопрос, но я новичок в метапрограммировании шаблонов и функциональном программировании в целом.

1 Ответ

0 голосов
/ 11 мая 2020

Вы можете это сделать:

// if VarInfo can be a single type
struct VarInfo
{
    //...

    template <class T>
    static constexpr VarInfo create(T var);
};

struct Vec3
{
    float x, y, z = 0.f

    static constexpr std::array<VarInfo, 3> var_infos = {    VarInfo::create(x),
                                                             VarInfo::create(y),
                                                             VarInfo::create(z)};
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...