Le problème est le type T
contenu dans Z
ne peut pas être déduit.
Fonctionne si vous l'explicite et je ne sais pas comment éviter d'explicite.
#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, "!");
}
- EDIT -
Works si votre Z
exigent un premier type d'argument (la manière de std::integer_sequence
); De cette façon, la déduction fonctionne
#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-
Dans 17 œuvres C + avec 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);
}
Oui, c'était ma solution de rechange, que je dois éviter. Donc, il n'y a aucun moyen de maintenir ma syntaxe? – prestokeys
@prestokeys - autant que je sache, non. Mais je ne suis pas un expert et quelqu'un de mieux que moi peut trouver une solution. Peut-être qu'avec C++ 17 devrait être possible (mais vous avez marqué C++ 11) mais j'échoue également avec lui. – max66
@prestokeys - répond un peu amélioré mais pas exactement ce que vous avez demandé – max66