Проверьте размеры одинаковы при компиляции - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть словарь и массив, которые не меняют размер во время программы, но часто могут быть расширены до компиляции. Количество ключей и длина массива всегда должны быть одинакового размера. Есть ли способ проверить это при компиляции, так как было бы легко добавить ключ, но не в массив или наоборот?

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Есть способы проверить постоянные времени компиляции.В 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 = {};
}

, что приведет к ошибке времени компиляции, если они не совпадают.

2 голосов
/ 16 ноября 2011

Предполагая, что под словарем вы подразумеваете map или unordered_map, немедленного способа сделать это во время компиляции не существует.Вы можете запустить assert в main ИЛИ вы можете заставить карту всегда инициализироваться из массива пар, а затем static_assert, что длина массива пар такая же, как у вашего основного массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...