c ++:static assert检查使用的const是否在预定义列表中

use*_*223 7 c++ static-assert

如何解决这个问题:

我有预定义的整数常量列表:

const auto numbers = {1, 5, 10};
Run Code Online (Sandbox Code Playgroud)

我想使用static_assert(编译时)来检查是否有其他一些const值:

#define SOME_IDENTIFIER 1
Run Code Online (Sandbox Code Playgroud)

在列表中.你会怎么做?可能吗?谢谢!

Vit*_*meo 8

C++ 2A:

constexpr std::array numbers{1, 5, 10};

constexpr int some_id = 1;
static_assert(std::any_of(numbers.begin(), numbers.end(), 
    [](const auto& x){ return x == some_id; }));
Run Code Online (Sandbox Code Playgroud)

C++ 17:

template <typename C, typename X>
constexpr bool contains(const C& container, const X& x)
{
    for(const auto& elem : container) if(x == elem) return true;
    return false;
}

constexpr std::array numbers{1, 5, 10};

constexpr int some_id = 1;
static_assert(contains(numbers, some_id));
Run Code Online (Sandbox Code Playgroud)

wandbox.org上的实例


C++ 14:

constexpr int numbers[]{1, 5, 10};

constexpr int some_id = 1;
static_assert(contains(numbers, some_id));
Run Code Online (Sandbox Code Playgroud)

wandbox.org上的实例


C++ 11:

template <typename T>
constexpr bool contains_impl(std::size_t n, const T* arr, const T& x)
{
    return n != 0 && (arr[0] == x || contains_impl(n - 1, arr + 1, x));
}

template <typename T, std::size_t N>
constexpr bool contains(const T(&arr)[N], const T& x)
{
    return contains_impl<T>(N, &arr[0], x);
}
Run Code Online (Sandbox Code Playgroud)

wandbox.org上的实例

  • @VittorioRomeo - 在创纪录的时间内,不低于:P (2认同)