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

时间:2016-02-04 01:34:54

标签: c++ c++11 c++14

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

template<class ... T>
struct ComponentList {};

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

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

2 个答案:

答案 0 :(得分:9)

您可以添加模板,将参数从类型级别列表重新绑定到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;
};

答案 1 :(得分:2)

您是否能够强制执行所有类型列表类提供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;