的問題是包含在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