Есть много вещей, которые вы можете сделать с метапрограммированием.Но сначала я хотел бы спросить: почему вы хотите сделать это в вашем случае?Я мог бы понять, нужно ли вам объявлять такой массив в разных местах, чтобы он требовал переписывать одни и те же вещи несколько раз.Это ваш случай?
Говоря «определите программно», я предлагаю следующее:
#define MyArr(macro, sep) \
macro(0) sep \
macro(0) sep \
macro(2) sep \
macro(3) sep \
macro(0) sep \
macro(0) sep \
macro(0)
К настоящему времени мы определили все значения, которые вы хотели, самым абстрактным образом.Кстати, если эти значения действительно что-то значат для вас - вы можете добавить это к объявлению:
#define MyArr(macro, sep) \
macro(0, Something1) sep \
macro(0, Something2) sep \
// ...
Теперь давайте вдохнем жизнь в вышеприведенное объявление.
#define NOP
#define COMMA ,
#define Macro_Count(num, descr) 1
#define Macro_Value(num, descr) num
const std::size_t size = MyArr(Macro_Count, +);
unsigned int list[size] = { MyArr(Macro_Value, COMMA) };
Вы также можете обработатьситуация, когда большинство ваших записей массива одинаковы, с некоторым извращенным творчеством:)
Но вы всегда должны спросить себя: стоит ли это того?Потому что, как вы видите, вы превращаете код в головоломку.