Поскольку повышение было упомянуто в разделе комментариев, вот еще одно совершенно другое решение, основанное на 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.