我正在尝试创建一个具有传递给它的所有类型的元组的类.我希望它将类型列表作为模板参数,并使用该列表中的类作为内部元组将包含的类.目前,我有类似的东西,实际上并没有编译.
template<class ... T>
struct ComponentList {};
template<ComponentList<typename ...T> >
class ComponentManager{
std::tuple<T...> components;
};
Run Code Online (Sandbox Code Playgroud)
我想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;
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
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';
}
Run Code Online (Sandbox Code Playgroud)
我想如果你想强制执行原始类型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;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
861 次 |
| 最近记录: |