Reputation: 4453
Given:
typedef std::integer_sequence<int, 0,4,7> allowed_args_t;
and:
template<int arg> void foo()
{
static_assert( /*fire if arg not in allowed_args_t!*/ )
}
How should I write that static_assert
to be as cheap as possible in compile-time?
I'm using C++17.
Upvotes: 4
Views: 412
Reputation: 217398
You might want to use:
template <int ... Is>
constexpr bool is_in(int i, std::integer_sequence<int, Is...>)
{
return ((i == Is) || ...);
}
typedef std::integer_sequence<int, 0, 4, 7> allowed_args_t;
template<int arg> void foo()
{
static_assert(is_in(arg, allowed_args_t{}));
}
Upvotes: 14
Reputation: 25317
Unpack the integers and use a fold expression:
template <typename AllowedIntegers>
struct contains
{};
template <typename Int, Int... Is>
struct contains<std::integer_sequence<Int, Is...>>
{
template <Int value>
static constexpr bool contains = ((value == Is) || ...);
};
// ...
template <int arg>
void foo()
{
static_assert(contains<allowed_args_t>::contains<arg>);
}
Upvotes: 8