Je voudrais vérifier s’il existe ou non une spécialisation de modèles, où le cas général n’est pas défini
Donné:
template struct A; // general definition not defined template struct A {}; // specialization defined for int
Je voudrais définir une structure comme ceci:
template struct IsDefined { static const bool value = ???; // true if A exist, false if it does not };
Existe-t-il un moyen de le faire (idéalement sans C ++ 11)?
Merci
En utilisant le fait que vous ne pouvez pas appliquer sizeof
à un type incomplet:
template std::true_type is_complete_impl(T *); std::false_type is_complete_impl(...); template using is_complete = decltype(is_complete_impl(std::declval()));
Voir en direct sur Coliru
Voici une solution C ++ 03 légèrement maladroite mais fonctionnelle:
template char is_complete_impl(char (*)[sizeof(T)]); template char (&is_complete_impl(...))[2]; template struct is_complete { enum { value = sizeof(is_complete_impl(0)) == sizeof(char) }; };
Voir en direct sur Coliru
Ceci est une implémentation alternative utilisant toujours la même astuce que @Quentin utilisée
Version C ++ 11
template using first_t = First; template struct is_complete_type: std::false_type {}; template struct is_complete_type> : std::true_type {};
Exemple sur wandbox
Version provisoire C ++ 03 qui ne fonctionne pas
template struct first { typedef First type; }; template struct is_complete_type { static const bool value = false; }; template struct is_complete_type< typename first::type > { static const bool value = true; };
L’erreur dans ce cas est
prog.cc:11:8: erreur: parameters de modèle non déductibles dans la spécialisation partielle: struct is_complete_type
{static const bool value = true; }; ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ prog.cc:11:8: note: ‘T’