Comment décider s’il existe une spécialisation de modèles

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’