static_assert数组值

时间:2015-11-29 18:29:26

标签: c++ arrays c++11 static-assert

是否可以对数组值进行编译时检查?

示例:

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

2 个答案:

答案 0 :(得分:1)

这些方面的一些东西,也许是:

{{1}}

Live demo

答案 1 :(得分:0)

我想,这可以提高效率,但我认为以下代码可以正常工作:

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