你可以试试这个:
template <template <typename...> class Pred, typename ...Args> struct check_odd;
template <template <typename...> class Pred>
struct check_odd<Pred> : std::true_type { };
template <template <typename...> class Pred, typename T>
struct check_odd<Pred, T> : Pred<T> { };
template <template <typename...> class Pred, typename T1, typename T2, typename ...Args>
struct check_odd<Pred, T1, T2, Args...>
{
static constexpr bool value = Pred<T1>::value && check_odd<Pred, Args...>::value;
};
用法:
static_assert(check_odds<std::is_arithmetic, T1, T2, T3, T4, T5, T6>::value,
"Not all odd types are arithmetic.");
明显的泛化途径是参数化组合器(当前硬编码为“AND”,或&&
),并为谓词提供附加参数。