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)
我想检查每个T在Types的形式是一个专业化S<U>,不知道什么事U.
可能吗?
我们只需要检查专业化:
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)