类型数组?

Array of types?

本文关键字:数组 类型      更新时间:2023-10-16

我有几个结构,我想创建一个它们的数组,以便我可以将其成员用作模板的参数,类似于types = {int, float}; multiply<types[i]>();。它可以通过重载来完成,但我有很多功能,所以这不是一种方法。据我所知,我们只能将类型存储为指针(所以我实际上必须取消引用它:multiply<*types[i]>();(,但在这里我停下来理解,因为要创建一个指针,我必须知道它指向的变量的类型,以及类的类型是什么(类型(?我想"搞砸了,我会使用 auto",但后来似乎是指向不同类的指针是不同类型的,所以我必须擦除它们的类型以将它们存储在一个公共数组中,依此类推,我现在有这个:

auto types = {std::make_shared<void>(Student), std::make_shared<void>(Citizen)};

它说StudentCitizen不是指值。

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++是一种非常困难的编程语言(我不声称掌握,只是为了使用(。