如何创建类型列表以扩展到元组

How do I create a type list to expand into a tuple?

本文关键字:列表 扩展到 元组 类型 何创建 创建      更新时间:2023-10-16

我正在尝试创建一个类,该类具有传递给它的所有类型的元组。我希望它将类型列表作为模板参数,并将该列表中的类用作内部元组将包含的类。目前,我有这样的东西,它实际上并没有编译。

template<class ... T>
struct ComponentList {};
template<ComponentList<typename ...T> >
class ComponentManager{
    std::tuple<T...> components;
};

我希望ComponentList成为自己的类型的原因是因为我还想稍后传入其他类型列表。这可能吗?如果没有,还有什么可行的替代方案?

您可以添加一个模板,将类型级列表中的参数重新绑定到std::tuple

template<class A, template<class...> class B>
struct rebind_;
template<template<class...> class A, class... T, template<class...> class B>
struct rebind_<A<T...>, B> {
    using type = B<T...>;
};
template<class A, template<class...> class B>
using rebind = typename rebind_<A, B>::type;

然后像这样使用它:

template<class... T>
struct ComponentList {};
template<class List>
struct ComponentManager {
    rebind<List, std::tuple> components;
};
int main() {
    using List = ComponentList<int, char, long>;
    ComponentManager<List> manager;
    std::cout << std::get<0>(manager.components) << 'n';
}

我想如果你想强制原始类型是ComponentList,你可以使用enable_ifis_instantiation_of

template<class List,
    typename = std::enable_if<is_instantiation_of<List, ComponentList>::value>::type>
struct ComponentManager {
    rebind<List, std::tuple> components;
};

您是否能够强制所有类型列表类都提供具有内部类型的tuple_t类型?像这样:

template <class ... T>
struct ComponentList {
    typedef std::tuple<T...> tuple_t;
};
template<class T>
class ComponentManager {
    typename T::tuple_t components;
};

使用情况是您所期望的:

ComponentManager<ComponentList<int, double> > cm;