Есть способы проверить постоянные времени компиляции.В C ++ 11 это было сцементировано с static_assert
, но это возможно и с шаблонами.
Например, с учетом:
enum Key {
K_Zero,
K_One,
K_Two,
K_NUMBER_ELEMENTS
};
static char const Dictionary[] = { ... };
Вы бы сделали это C ++ 11:
static_assert(K_NUMBER_ELEMENTS == ARRAY_SIZE(Dictionary),
"Keys / Dictionary mismatch");
Где ARRAY_SIZE
определяется как:
template <typename T, unsigned N>
char (&ComputeArraySize(T (&)[N]))[N];
#define ARRAY_SIZE(Array) sizeof(ComputeArraySize(Array))
Если вы все еще в C ++ 03 (что, вероятно, имеет место, если вы не знаете версию),тогда вы должны быть немного умнее и заменить static_assert
на:
template <unsigned M, unsigned N> struct mp_equal;
template <unsigned N> struct mp_equal<N,N> {};
namespace {
mp_equal<K_NUMBER_ELEMENTS, ARRAY_SIZE(Dictionary)>
AssertKeysAndDictionarySizeMatch = {};
}
, что приведет к ошибке времени компиляции, если они не совпадают.