инициализировать массив постоянного размера времени компиляции с увеличивающимися числами - PullRequest
0 голосов
/ 21 января 2019

У меня есть массив, размер которого задается с помощью постоянной времени компиляции (препроцессор #define в моем случае). Мне нужно инициализировать его, используя последовательные номера во время компиляции. Как я могу это сделать?

Упрощенный пример:

#define ARR_SZ 5
struct C {
  C(int a) : a(a) {}
  int a;
};
C arr[ARR_SZ] = {{0},{1},{2},{3},{4}}; // This needs to adapt to any number

Я могу использовать C ++ 11, но не новее (хотя мне было бы интересно узнать о новых методах, даже если я не могу использовать их для этого проекта)

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Поскольку повышение было упомянуто в разделе комментариев, вот еще одно совершенно другое решение, основанное на Boost.PP. Это также полностью C ++ 03.

#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>

#define ARR_SZ 5
struct C {
  C(int a) : a(a) {}
  int a;
};

#define INIT(z, n, d) BOOST_PP_COMMA_IF(n) C(n)

C arr[ARR_SZ] = { BOOST_PP_REPEAT(ARR_SZ, INIT, ?) };


int main () {

}

BOOST_PP_REPEAT расширится до INIT(z, 0, ?) ... INIT(z, 4, ?). Символ z не имеет отношения к нашей цели, а токен ? является просто заполнителем. Поскольку INIT, в свою очередь, расширяется до C(n) для n с 0 до 4 (через запятую), мы получаем инициализатор для обычного массива стиля C.

0 голосов
/ 21 января 2019

C ++ 14 код (из-за std::integer_sequence):

#include <type_traits>
#include <array>

#define ARR_SZ 5
struct C {
  C(int a) : a(a) {}
  int a;
};

template<int ...Is>
auto make_C_arr(std::integer_sequence<int, Is...>) -> std::array<C, sizeof...(Is)> {
    return {{ {Is}... }};
}

auto arr = make_C_arr(std::make_integer_sequence<int, ARR_SZ>{});

int main () {

}

std::integer_sequence и т.п. могут быть реализованы в C ++ 11, однако, как отмечено в комментарии, поэтому замена стандартной версии на домашнюю, даст конкретное решение для C ++ 11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...