определить наличие элемента в compile time списке
От: B0FEE664  
Дата: 22.05.20 22:21
Оценка:
Я помню, что здесь на форуме было видео где описывалась решение следующей задачи:
есть некоторое количество констант. Как красиво и эффективно написать выражение, которое будет проверять наличие некоторого значения в этом списке.
Видео найти мне не удалось, поэтому я набросал два решения:

enum class Color
{
  eRed, eBlue, eYellow
};


template<class T, T ...TArgs>
struct StaticEnumSet;

template<class T, T t>
struct StaticEnumSet<T, t>
{
  static inline bool has(T x) noexcept
  {
    return t == x;
  };
};


template<class T, T t, T ...TArgs>
struct StaticEnumSet<T, t, TArgs...>
{
  static inline bool has(T x) noexcept
  {
    return t == x || StaticEnumSet<T, TArgs...>::has(x);
  };
};

Color x = Color::eYellow;
StaticEnumSet<Color, Color::eRed, Color::eBlue>::has(x);

и
template <class... Args>
auto one_of(Args... args)
{
  return [args...](auto x) { return ((args == x) || ...);};
}

bool bNo  = one_of(Color::eRed, Color::eBlue)(x);
bool bYes = one_of(Color::eRed, Color::eYellow, Color::eBlue)(x);


но мне кажется, что уже должно быть что-то более продуманное. Подскажите?
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.