7

根据变量,我需要选择 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

4 回答 4

16

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

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

于 2014-04-09T08:46:49.933 回答
2

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

int* arrayPointer = useSeedPositions32 ? SeedPositions32.data() : SeedPositions16.data();
于 2014-04-09T09:03:33.930 回答
2

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>如果不需要全部 32 个元素,为什么不简单地只声明 a并只使用它的前 16 个元素?

于 2014-04-09T09:20:18.100 回答
1

你可以这样做:

int * myArray = use32 ? &SeedPositions32[0] : &SeedPositions16[0];
于 2014-04-09T08:47:30.033 回答