С++ как инициализировать 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]);
}
}
Надеюсь, вы понимаете, что я пытаюсь, извините, если я удвоил вопрос, я, должно быть, не обратил на это внимания.
Ответы
Ответ 1
Как насчет этого?
#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;
}
Ответ 2
Самый простой способ - получить заполненный массив из функции и использовать его для инициализации объекта const
(или constexpr
). Однако встроенные массивы не могут быть скопированы, но std::array<T, N>
be:
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';
}
Ответ 3
Вы можете создать записываемый массив, инициализировать его и затем создать ссылку на него const.
int arry[255];
void generateData(){
for(int i = 0; i < 255; i++) {
initializeSomehowTo(5, arry[i]);
}
}
const int (&array)[255] = arry;