类型数组?
Array of types?
我有几个结构,我想创建一个它们的数组,以便我可以将其成员用作模板的参数,类似于types = {int, float}; multiply<types[i]>();
。它可以通过重载来完成,但我有很多功能,所以这不是一种方法。据我所知,我们只能将类型存储为指针(所以我实际上必须取消引用它:multiply<*types[i]>();
(,但在这里我停下来理解,因为要创建一个指针,我必须知道它指向的变量的类型,以及类的类型是什么(类型(?我想"搞砸了,我会使用 auto",但后来似乎是指向不同类的指针是不同类型的,所以我必须擦除它们的类型以将它们存储在一个公共数组中,依此类推,我现在有这个:
auto types = {std::make_shared<void>(Student), std::make_shared<void>(Citizen)};
它说Student
和Citizen
不是指值。
C++中方便的内置类型数组是std::tuple<Types...>
。
要访问 std::tuple 中的第 i 个类型,请使用std::tuple_element_t<i, your_tuple>
。
例如:
using types = std::tuple<int, float>;
multiply<std::tuple_element_t<i, types>>();
类型仅在编译时"存在",因此所有索引都需要在编译时,并且将它们存储在类型信息中(此处为std::tuple
中的可变参数类型(,而不是存储在变量中。
可以使用帮助程序类型来减少此内容的详细程度:
template<class... Types>
struct type_array {
using as_tuple = std::tuple<Types...>;
template<std::size_t I>
using get = std::tuple_element_t<I, as_tuple>;
static constexpr std::size_t size = sizeof...(Types);
};
using types = type_array<int, float>;
multiply<types::get<i>>();
我有几个结构,我想创建一个数组
在C++中,数组包含所有相同类型的元素。在运行时,类型在擦除后消失了(RTTI 除外,与dynamic_cast
相关(。因此,您不能直接拥有一个包含不同类型元素的数组(或者不要将其称为数组(。
有关C++的更多信息,请参阅此站点和更高版本的 C++11 标准 n3337。您也可以找到 C++17 标准。
看起来您希望在C++中使用一些标记的联合。然后考虑使用 C++17 中的标准std::variant
模板。
如果您想要产品类型,请使用Artyer回答的当然std::tuple
在现有C++容器符合您的需求时,利用它们。当然,您可以将它们与产品类型,总和类型,字符串,嵌套容器,智能指针等组合在一起。
如果您不能使用 C++17 而只能使用 C++11 并且需要实现一些标记的联合,请使用一些匿名union
但请注意五法则。还可以考虑使用 Boost 或 Qt(两者都以自己的方式提供标记联合(。
另请阅读一本好的C++编程书籍,因为C++是一种非常困难的编程语言(我不声称掌握,只是为了使用(。
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 取消引用结束指针到数组类型的一个
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 如何在数组类型的模板代码中计算std::size_t
- LLVM 无法将数组类型强制转换为常量数组
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 特征:从数组类型中获取标量类型是否记录?
- T D[N] 总是声明数组类型的对象吗?
- 如何在模板中推断数组类型?
- 尝试使用 Array 类的模板构造整数数组时,错误:为什么数组类型"int [5]"不可分配,
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 如何为所有非数组类型专门化模板?
- 数组类型 (C++) 的初始化
- 我预测char数组类型值只能投射指针类型
- 将数组类型更改为 Int16 会节省存储空间吗?
- 采用通用数组类型的函数
- 数组类型 'int [8]'不可分配
- 数组类型 'float [size]'不可分配
- C++。候选模板被忽略 - 无法将数组类型与自身匹配