Я помню, что здесь на форуме было видео где описывалась решение следующей задачи:
есть некоторое количество констант. Как красиво и эффективно написать выражение, которое будет проверять наличие некоторого значения в этом списке.
Видео найти мне не удалось, поэтому я набросал два решения:
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);
но мне кажется, что уже должно быть что-то более продуманное. Подскажите?