static_assert 数组值
static_assert on array values
是否可以对数组值进行编译时检查?
示例:
typedef enum
{
dummy0 = 0,
dummy1,
dummy2
} eDummyEnum;
typedef struct
{
eDummyEnum name;
int value;
} sDummyStruct;
const sDummyStruct array[]=
{
{dummy0, 3},
{dummy1, 5},
{dummy2, 6}
}
有没有可能在编译时检查是否array[dummy1].name == dummy1
?
大概是这样的:
constexpr sDummyStruct array[]=
{
{dummy0, 3},
{dummy1, 5},
{dummy2, 6}
};
constexpr bool checkArray(int index) {
return (index >= sizeof(array)/sizeof(array[0])) ||
(array[index].name == index && checkArray(index + 1));
}
static_assert(checkArray(0), "bad array");
我想,这可能会更有效一些,但我认为以下代码确实可以正常工作:
template <typename T, int N>
constexpr int size(T(&)[N]) {
return N;
}
template <int I, int J>
struct check_name {
static constexpr bool check() {
return array[I].name != array[J].name
&& check_name<I + 1, J>::check()
&& check_name<I, J - 1>::check();
}
};
template <int I>
struct check_name<I, I> {
static constexpr bool check() { return true; }
};
constexpr bool check_names() {
return check_name<0, size(array) - 1>::check();
}
static_assert(check_names(), "duplicate names");
是否可以对数组值进行编译时检查?
示例:
typedef enum
{
dummy0 = 0,
dummy1,
dummy2
} eDummyEnum;
typedef struct
{
eDummyEnum name;
int value;
} sDummyStruct;
const sDummyStruct array[]=
{
{dummy0, 3},
{dummy1, 5},
{dummy2, 6}
}
有没有可能在编译时检查是否array[dummy1].name == dummy1
?
大概是这样的:
constexpr sDummyStruct array[]=
{
{dummy0, 3},
{dummy1, 5},
{dummy2, 6}
};
constexpr bool checkArray(int index) {
return (index >= sizeof(array)/sizeof(array[0])) ||
(array[index].name == index && checkArray(index + 1));
}
static_assert(checkArray(0), "bad array");
我想,这可能会更有效一些,但我认为以下代码确实可以正常工作:
template <typename T, int N>
constexpr int size(T(&)[N]) {
return N;
}
template <int I, int J>
struct check_name {
static constexpr bool check() {
return array[I].name != array[J].name
&& check_name<I + 1, J>::check()
&& check_name<I, J - 1>::check();
}
};
template <int I>
struct check_name<I, I> {
static constexpr bool check() { return true; }
};
constexpr bool check_names() {
return check_name<0, size(array) - 1>::check();
}
static_assert(check_names(), "duplicate names");