检查大小在编译时是相同的

Check sizes are the same when compiling

本文关键字:编译 检查      更新时间:2023-10-16

我有一个字典和一个数组,它们在程序期间都不会改变大小,但通常可以在预编译时扩展。键的数量和数组长度应该始终是相同的大小。在编译时是否有一种方法可以检查这一点,因为它很容易添加键,但不添加到数组或反之亦然?

有很多方法可以检查编译时间常数。在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 = {};
}

如果它们不匹配,将触发编译时错误

假设字典指的是mapunordered_map,那么在编译时没有直接的方法来完成它。你可以在main中运行assert,或者你可以强制映射总是从一对数组初始化,然后static_assert pair数组的长度与你的主数组相同。