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来存储所有包含成员变量infos(名称、大小、类型、地址(的元结构。例如:

#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。有可能做到吗
我用错工具了吗?还是我用错了工具
很抱歉,这可能是一个愚蠢的问题,但我对模板元编程和函数编程一般来说都是新手。

您可以这样做:

// 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)};
};

最新更新