您可以添加一個模板來重新綁定您的類型級列表中的參數爲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_if
和is_instantiation_of
:
template<class List,
typename = std::enable_if<is_instantiation_of<List, ComponentList>::value>::type>
struct ComponentManager {
rebind<List, std::tuple> components;
};
這是可能的,但我希望兩者的更好的解決方案的實施提供類的類型成爲'ComponentList',並且還能夠操作類型列表中的類型(例如,使它們成爲元組,而不是使它們成爲元組,使每個類型成爲類型的向量並將其粘在元組內)。 – user975989