如何检查一个类型是否是从模板函数中的某个可变参数模板 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");
}
假设我有:
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");
}