2016-02-04 62 views
7

我想創建一個具有傳遞給它的所有類型的元組的類。我希望它將類型列表作爲模板參數,並將該列表中的類用作內部元組將包含的類。目前,我有這樣的東西,它實際上並沒有編譯。如何創建一個類型列表展開爲一個元組?

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

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

我想有ComponentList是它自己的類型的原因是因爲我也想通過在其他類型的列表後。這可能嗎?如果不是,將會有什麼替代方案?

回答

6

您可以添加一個模板來重新綁定您的類型級列表中的參數爲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

您是否可以強制執行所有類型列表類提供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; 
+0

這是可能的,但我希望兩者的更好的解決方案的實施提供類的類型成爲'ComponentList',並且還能夠操作類型列表中的類型(例如,使它們成爲元組,而不是使它們成爲元組,使每個類型成爲類型的向量並將其粘在元組內)。 – user975989

相關問題