如何创建类型列表以扩展到元组
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_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;
};
您是否能够强制所有类型列表类都提供具有内部类型的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;
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 链表,将列表复制到另一个列表
- 在子集化后将包含索引号的列表列表映射到标准索引序列
- 列表C++移动到前面;
- 如何将 c++ 中的客户端 TCP 的替身列表发送到 Matlab 中的 TCP 服务器?
- 是否可以将图像列表保存到文件中?
- 可视化 如何将 CString 值列表添加到 MFC C++ 中的组合框中?
- 如何将共享指针列表传递到pybind11中的c++对象
- 如何在C++中定义扩展到条件语句的宏?
- 使用 Pybind11 将C++扩展到 Python
- 如何<double>通过TCP套接字将CLI 列表^发送到本机C++?
- "__cplusplus"宏扩展到什么?
- 将矢量的数据扩展到指定大小(插值)
- 将std ::列表附加到std ::列表的向量中
- 将 3 个列表合并到一个大列表中
- 将链接列表复制到linkedlist的引用
- 如何将模板参数包扩展到一系列模板化参数
- 在 c++ 中将数字从列表排序到数组中的气泡排序问题
- AVX2 根据条件将连续元素扩展到稀疏向量?(如AVX512 VP扩展)
- 如何创建类型列表以扩展到元组