c ++如何初始化数组的const元素

时间:2017-06-05 22:39:49

标签: c++ arrays initialization const

我需要一种方法来为我目前正在处理的程序初始化数组的const元素。 问题是我必须用函数初始化这些元素,没有办法像这样做:

const int array[255] = {1, 1278632, 188, ...};

因为我必须生成很多数据。 我尝试的是将 memcpy 数据发送到const int,但这不起作用而且没有用。

 const int array[255];

 void generateData(){
      for(int i = 0; i < 255; i++) {
          initializeSomehowTo(5, array[i]);
      }
 }

我希望你明白我在想什么,对不起如果我把这个问题翻倍,我一定会忽略它。

3 个答案:

答案 0 :(得分:18)

这个怎么样?

#include <array>
typedef std::array<int, 255> Array;

const Array array = generateData();

Array generateData(){
    Array a;
    for(int i = 0; i < a.size(); i++) {
        initializeSomehowTo(a[i]);
    }
    return a;
}

答案 1 :(得分:6)

最简单的方法是从函数中获取填充数组,并使用它来初始化const(或constexpr)对象。但是,无法复制内置数组,但std::array<T, N>为:

std::array<T, 255> array = initializeData();

如果你需要一个内置数组,我可以想象初始化一个类的static成员(实际上是模板),其中索引从std::make_index_sequence<255>扩展的索引扩展并用作位置数组中的参数,即沿着这些方向的东西:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <utility>

int some_function(std::size_t i) { return i; }

template <typename> struct initialized_array_base;
template <std::size_t... I>
struct initialized_array_base<std::index_sequence<I...>> {
    static const int array[sizeof...(I)];
};

template <std::size_t... I>
int const initialized_array_base<std::index_sequence<I...>>::array[sizeof...(I)]
    = { some_function(I)... };

struct initialized_array
    :initialized_array_base<std::make_index_sequence<256>> {
};

int main() {
    std::copy(std::begin(initialized_array::array),
              std::end(initialized_array::array),
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

答案 2 :(得分:3)

您可以创建一个可写数组,对其进行初始化,然后创建一个const引用。

int arry[255];

void generateData(){
  for(int i = 0; i < 255; i++) {
      initializeSomehowTo(5, arry[i]);
  }
}

const int (&array)[255] = arry;