Страницы

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

четверг, 11 октября 2018 г.

Инициализация массива на базе значений другого

Привожу сразу код для прояснения:
struct S { S(int) {} };
int iArr[] = { 1, 2, 3 }; S sArr[] = { iArr[0], iArr[1], iArr[2] };
Хочется избежать ручного изменения кода инициализации массива sArr при изменении количества значений в iArr. Интересует именно compile-time инициализация.
Возможно ли это? Если да, то как?
Интересуют варианты как для с++03 (наверное без макросов тут не обойтись), так и современный подход (скорее всего variadic-templates). Если что-то подходящее ожидается в новом Стандарте, то тоже было бы неплохо увидеть в ответах.


Ответ

C++14 решение на базе кода @Abyx:
#include #include #include
struct S { constexpr S(int i) : i(i*i) { } int i; };
template constexpr auto makeArrayHelper(const S(&src)[sizeof...(I)], std::index_sequence ) { return std::array{ { src[I]... } }; }
template constexpr auto makeArray(const S(&src)[N]) { return makeArrayHelper(src, std::make_index_sequence()); }
int main() { constexpr int iArr[] = { 1, 2, 3 };
constexpr auto sArr = makeArray(iArr);
for( auto& s : sArr ) { std::cout << s.i << "
"; } }

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

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