#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; ? :)
Комментариев нет:
Отправить комментарий