如何声明指向C++11 std::数组的指针

How do you declare a pointer to a C++11 std::array?

本文关键字:std C++11 数组 指针 何声明 声明      更新时间:2023-10-16

根据变量,我需要选择SeedPositions32或SeedPositings16数组以供进一步使用。我以为一个指针会允许这样做,但我无法让它发挥作用。如何声明指向C++11 std::数组的指针?我试过下面的。

array<int>* ArrayPointer;
//array<typedef T, size_t Size>* ArrayPointer;
array<int,32> SeedPositions32 = {0,127,95,32,64,96,31,63,16,112,79,48,15,111,80,
                               47,41,72,8,119,23,104,55,87,71,39,24,7,56,88,103,120};
array<int,16> SeedPositions16 = {...}

std::array有一个用于大小的模板参数。具有不同大小的两个std::array模板实例化是不同的类型。因此,你不可能有一个指针指向不同大小的数组(除了void*的欺骗,它打开了自己的蠕虫罐头。)

您可以使用客户端代码的模板,也可以使用std::vector<int>

例如:

template <std::size_t N>
void do_stuff_with_array(std::array<int, N> the_array)
{
  // do stuff with the_array.
}
do_stuff_with_array(SeedPositions32);
do_stuff_with_array(SeedPositions16);

请注意,您还可以获得指向数据的指针:

int* ArrayPtr =  SeedPositions32.data();

但是在这里,您已经丢失了大小信息。你必须独立地跟踪它。

您可以简单地使用std::array::data()成员函数将std::array的内容作为原始的类C数组指针进行访问:

int* arrayPointer = useSeedPositions32 ? SeedPositions32.data() : SeedPositions16.data();
juancopanza在他的回答中很好地解释了为什么你想要的东西不能起作用。

问题是你为什么要这么做?不可能使用(指向)std::array<int,32>的指针来代替std::array<int,16>

std::array<>的目的是在编译时跟踪元素的数量(同时避免为固定大小的小数组分配内存)。如果您希望在运行时管理元素的数量,则可能不应该使用std::array<>,而应该使用std::vector

获得指向底层数据的指针(使用其他答案中提出的std::array::data())并自己跟踪元素数量的替代方法有点危险,并不推荐。问题是,您必须确保指针永远不会悬空。

最后,我找不到任何可能的用例。为了使用指针,必须同时声明array<int,32>array<int,16>对象,但只能使用其中一个。如果不需要全部32个元素,为什么不简单地只声明一个array<int,32>并只使用它的前16个元素呢?

您可以这样做:

int * myArray = use32 ? &SeedPositions32[0] : &SeedPositions16[0];