Bool技巧和模板模板参数

sky*_*ack 2 c++ templates template-templates variadic-templates c++14

考虑bool技巧来检查一堆类型是否都是相同的类型:

template<typename Type, typename... Types>
static constexpr bool allOf = std::is_same<
    std::integer_sequence<bool, true, std::is_same<Type, Types>::value...>,
    std::integer_sequence<bool, std::is_same<Type, Types>::value..., true>
>::value;
Run Code Online (Sandbox Code Playgroud)

例如,可以使用它来检查所有参数是否为int值:

template<typename... Args>
void f(Args&&... args) {
    static_assert(allOf<int, Args...>, "!");
    // ...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将它与给定模板模板参数的特化一起使用?
例如,使用以下代码:

template<typename> struct S {};

template<typename... Args>
void f(Args&&... args) {
    static_assert(allOf<S, Args...>, "!");
    // ...
}
Run Code Online (Sandbox Code Playgroud)

allOf变量应定义为:

template<template<typename> class Type, typename... Types>
static constexpr bool allOf = ???;
Run Code Online (Sandbox Code Playgroud)

我想检查每个TTypes的形式是一个专业化S<U>,不知道什么事U.

可能吗?

Bar*_*rry 5

我们只需要检查专业化:

template <class T, template <class...> class Z>
struct isZ : std::false_type { };

template <class... Args, template <class...> class Z>
struct isZ<Z<Args...>, Z> : std::true_type  { };
Run Code Online (Sandbox Code Playgroud)

以及更通用的实现allOf:

template <bool... bs>
using allOf = std::is_same<
    std::integer_sequence<bool, true, bs...>,
    std::integer_sequence<bool, bs..., true>>;
Run Code Online (Sandbox Code Playgroud)

接着就,随即:

static_assert(allOf<isZ<decay_t<Args>, S>::value...>::value, "!");
Run Code Online (Sandbox Code Playgroud)