的问题是包含在Z
类型T
不能被推导出来。
作品,如果你明确它,我不知道如何避免明确。
#include <type_traits>
template <typename...>
struct is_empty : std::false_type
{ };
template <typename T, template <T...> class Z, T... Is>
struct is_empty<T, Z<Is...>> : std::true_type
{ };
template <typename T, template <T...> class Z, T First, T... Rest>
struct is_empty<T, Z<First, Rest...>> : std::false_type
{ };
template <int...> struct Z;
int main() {
static_assert(is_empty<int, Z<>>::value, "!");
}
- 编辑 -
工作,如果你Z
需要第一个参数类型(在std::integer_sequence
的样子);以这种方式演绎作品
#include <type_traits>
template <typename>
struct is_empty : std::false_type
{ };
template <typename T, template <typename U, U...> class Z, T... Is>
struct is_empty<Z<T, Is...>>
: std::integral_constant<bool, sizeof...(Is) == 0U>
{ };
template <typename T, T ...>
struct X
{ };
template <int ... Is>
using Y = X<int>;
int main()
{
static_assert(is_empty<X<int>>::value, "!");
static_assert(is_empty<Y<>>::value, "!");
}
- EDIT 2 -
在C++ 17件作品与auto
#include <type_traits>
template <typename Pack>
struct is_empty : std::false_type
{ };
template <template <auto...> class Z, auto... Is>
struct is_empty<Z<Is...>> : std::bool_constant<sizeof...(Is) == 0U>
{ };
template <int...>
struct X;
int main()
{
static_assert(true == is_empty<X<>>::value);
static_assert(false == is_empty<X<1>>::value);
static_assert(false == is_empty<int>::value);
}
是的,那是我的备用解决方案,我需要避免。所以没有办法维护我的语法? – prestokeys
@prestokeys - 据我所知,没有。但我不是专家,有人比我更能找到解决方案。也许用C++ 17应该是可能的(但是你标记了C++ 11),但是我也没有用它。 – max66
@prestokeys - 回答有点改进,但不完全是你问的 – max66