簡體   English   中英

如何創建類型列表以擴展為元組?

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

我正在嘗試創建一個具有傳遞給它的所有類型的元組的類。 我希望它將類型列表作為模板參數,並使用該列表中的類作為內部元組將包含的類。 目前,我有類似的東西,實際上並沒有編譯。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM