Я создаю вариационный шаблон.
Скажем, у меня есть что-то вроде этого:
template<typename T, T ... Numbers>
class Sequence final {
// Unpack parameter pack into a constexpr array
constexpr static T count = sizeof...(Numbers);
constexpr static T numbers[count] = { Numbers... };
// ...
}
Экземпляры этого класса могут быть созданы так:
Sequence<uint32_t, 1, 2, 3, 42, 25> seq;
Я хотел бы убедиться, что во время компиляции с помощью static_assert
пакет параметров numbers
содержит только определенные числа. Для этого примера предположим, что я хочу только разрешить 0
или 1
.
Итак, я хотел бы сделать что-то вроде:
for (size_t i = 0; i < count; i++) {
static_assert(numbers[i] == 1 || numbers[i] == 0, "Only ones and zeroes are allowed.");
}
Но, очевидно, static_assert
не работает с циклом for
. Я уверен, что для этого должен быть какой-то синтаксис, но я не смог понять это.
Я бы предпочел использовать что-то, что компилируется с компилятором С++ 11 (или, возможно, компилятором С++ 14, если он не выполним в С++ 11).