На самом деле эта «проблема» кажется чрезвычайно простой. Делая некоторые вычисленные смещения значков, я предложил следующий подход:
namespace Icons {
struct IconSet {
constexpr IconSet(size_t base_offset) noexcept
: base_offset_(base_offset), icon(base_offset * 3), iconSmall(icon + 1), iconBig(icon + 2) {
}
size_t icon;
size_t iconSmall;
size_t iconBig;
size_t base_offset_;
constexpr size_t next() const {
return base_offset_ + 1;
}
};
static constexpr IconSet flower = IconSet(0);
static constexpr IconSet tree = IconSet(flower.next());
static constexpr IconSet forest = IconSet(tree.next());
static constexpr IconSet mountain = IconSet(forest.next());
}
Теперь можно написать Icons::tree.iconBig
, например, чтобы получить вычисленное смещение этого значка. По сути, дизайнер может изменять значки, иногда добавляя и удаляя их, но всегда должен предоставлять весь набор (обычный, маленький и большой) по соглашению.
Как вы видите, проблема с этим подходом заключается в том, что мне пришлось сделать эту функцию next()
и использовать ее многократно - нормальный enum не имел бы этого недостатка.
Я знаю о BOOST_PP и других трюках с макросами, но я надеялся на что-то без макросов - поскольку у меня есть ощущение, что это не нужно, и я бы тогда предпочел то, что у меня уже есть, с простой функцией next()
.
Другим решением, конечно, было бы просто обычное перечисление и функция вычисления, но это побеждает цель выкладывать их предварительно вычисленными.
Следовательно, я ищу простое и портативное решение, которое предоставит такую функциональность, как перечисление. Это не должно быть время компиляции или constexpr
, если, например, просто inline сделает это проще.