Страницы

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

суббота, 7 декабря 2019 г.

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

#cpp #массивы


Привожу сразу код для прояснения:

struct S {
    S(int) {}
};

int iArr[] = { 1, 2, 3 }; 
S sArr[] = { iArr[0], iArr[1], iArr[2] };


Хочется избежать ручного изменения кода инициализации массива sArr при изменении
количества значений в iArr. Интересует именно compile-time инициализация.

Возможно ли это? Если да, то как?

Интересуют варианты как для с++03 (наверное без макросов тут не обойтись), так и
современный подход (скорее всего variadic-templates). Если что-то подходящее ожидается
в новом Стандарте, то тоже было бы неплохо увидеть в ответах.
    


Ответы

Ответ 1



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 << "\n"; } }

Ответ 2



Гм, для C++03 через #define - чем не вариант #define INIT { 1, 6, 3, 7, 8, 9 } int iArr[] = INIT; S sArr[] = INIT; ? :)

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

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