如何声明指向C ++ 11 std :: array的指针?

时间:2014-04-09 08:44:46

标签: c++ pointers c++11 stdarray

根据变量的不同,我需要选择SeedPositions32或SeedPositions16数组以供进一步使用。我认为一个指针可以允许这个,但我无法播种使它工作。如何声明指向C ++ 11 std :: array的指针?我尝试了下面的内容。

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 = {...}

4 个答案:

答案 0 :(得分:14)

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();

但是在这里,你丢失了尺寸信息。您必须独立跟踪它。

答案 1 :(得分:3)

在他的回答中,juanchopanza非常清楚地解释了为什么你想要的不起作用。

问题是你为什么要那样做?您无法使用(指针)std::array<int,32>代替std::array<int,16>

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

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

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

答案 2 :(得分:1)

你可以这样做:

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

答案 3 :(得分:1)

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

int* arrayPointer = useSeedPositions32 ? SeedPositions32.data() : SeedPositions16.data();