c ++: статический assert, проверяющий, находится ли используемый const в предопределенном списке - PullRequest
0 голосов
/ 03 мая 2018

как решить эту проблему:

У меня есть предопределенный константный список целых чисел:

const auto numbers = {1, 5, 10};

Я хочу использовать static_assert (время компиляции), чтобы проверить, есть ли какое-либо другое значение const:

#define SOME_IDENTIFIER 1

находится в списке. Как бы Вы это сделали? Является ли это возможным? Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

А в C ++ 11 со старой доброй частичной ручной специализацией (упрощенная версия, где numbers являются глобальными):

constexpr std::array<int,3> numbers = {1, 5, 10};

template <size_t I,int N>
struct check {
   static constexpr bool value = 
      (numbers[I] == N) || check<I-1,N>::value;
};

template <int N>
struct check<0,N> {
   static constexpr bool value = (numbers[0] == N);
};

constexpr int n = 1;
static_assert(check<numbers.size()-1,n>::value);
0 голосов
/ 03 мая 2018

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

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

живой пример на wandbox.org


C ++ 14:

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

constexpr int some_id = 1;
static_assert(contains(numbers, some_id));

живой пример на 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);
}

живой пример на wandbox.org

...