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");

Live demo

我想,这可能会更有效一些,但我认为以下代码确实可以正常工作:

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");