给出:
typedef std::integer_sequence<int, 0,4,7> allowed_args_t;
和:
template<int arg> void foo()
{
static_assert( /*fire if arg not in allowed_args_t!*/ )
}
我应该怎么写static_assert
在编译时尽可能便宜?
我正在使用C ++ 17。
答案 0 :(得分:13)
您可能要使用:
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{}));
}
答案 1 :(得分:8)
解压缩整数并使用折叠表达式:
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>);
}