Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Инициализация массива

#cpp


Как заполнить std::array N одинаковыми константами при инициализации?
    


Ответы

Ответ 1



При помощи относительно несложной шаблонной магии, а именно, применяя Variadic Templates (шаблоны с переменным числом параметров), можно на стадии компиляции построить массив, содержащий требуемое количество одинаковых элементов. #include #include // Контейнер для массива. // numbers - список чисел для инициализации. template struct Array { using array = std::array; static constexpr array data { { numbers... } }; }; // Генератор. // count - кол-во элементов. // fill - число, которым будет заполнен массив. template struct Generator : Generator { }; // Реализация, останавливающая рекурсию. template struct Generator<0, fill, numbers...> { using Data = Array; }; // Проверка. int main() { const unsigned N = 10; auto a = Generator::Data::data; for (int i : a) std::cout << i << " "; }

Ответ 2



std::arra x{ 2,2,2 }; :) Разве что писать свое, типа using namespace std; template class array_v: public array { public: array_v(T x) { fill(x); } }; template void out(const array& a) { for(auto x: a) cout << x << " "; cout << endl; } int main () { array_v a(5); out(a); }

Ответ 3



Если это надо в рантайме, то просто пишем вспомогательную функцию: template auto array_of_ints(int value) { std::array a; a.fill(value); return a; } Если заполненный std::array нужен на этапе компиляции, то всё чуть сложнее. В действующем стандарте у std::array нет constexpr функций, по этому придется воспользоваться списком инициализации. Чтобы получить список инициализации нужного размера, можно распаковать std::index_sequence: template constexpr auto array_of_ints_impl(int value, std::index_sequence) { return std::array{((void)I, value)...}; } template constexpr auto array_of_ints(int value) { return array_of_ints_impl(value, std::make_index_sequence{}); } Здесь {((void)I, value)...} превращается в {value, ..., value}, каст (void)I нужен чтобы подавить предупреждение компилятора. Проверка: http://coliru.stacked-crooked.com/a/a7e823996011ef39

Комментариев нет:

Отправить комментарий