我有一个字典和一个数组,它们在程序期间既不会改变大小,但通常可以在编译前进行扩展。键的数量和数组长度应始终相同。有没有办法在编译时检查这个,因为它很容易添加密钥而不是数组,反之亦然?
答案 0 :(得分:3)
有一些方法可以检查编译时常量。在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 = {};
}
如果它们不匹配,将触发编译时错误。
答案 1 :(得分:2)
假设你的字典意思是map
或unordered_map
,那么在编译时没有直接的方法。您可以在assert
中运行main
或者您可以强制地图始终从对数组中初始化,然后static_assert
表示对数组的长度与主数据相同阵列。