如何检查一个类型是否是从模板函数中的某个可变参数模板 class 实例化的?

How to check if a type is instantiated from a certain variadic template class in a template function?

假设我有:

template <typename...>
class Foo { };

那我再定义一个函数:

template <typename... T>
void Bar(const T&... arguments) { }

如何检查传递给 Bar 的所有 T 是否都是从 Foo 实例化的?喜欢:

Foo<int> a;
Foo<int, int> b;
Bar(a, b); // OK
int c;
Bar(a, b, c); // ill-formed

我想要一种检测格式错误的参数的方法,例如 Bar(a, b, c); 有办法做到这一点吗?

您可以创建一个特征来测试 Foo 的实例化,然后将其折叠到所有参数中。

template <typename>
struct is_foo : std::false_type {};

template <typename... Ts>
struct is_foo<Foo<Ts...>> : std::true_type {};

template <typename T>
constexpr bool is_foo_v = is_foo<T>::value;

template <typename... T>
void Bar(const T&... arguments) {
    static_assert((is_foo_v<T> && ...), "arguments must all be Foos");
}

See it on coliru