Je sais qu'il existe de nombreuses façons possibles de détecter si une classe a une fonction spécifique mais qu'il ne travaille pas vraiment pour mon cas exact. Ma mise en œuvre actuelle pour vérifier que la fonction de fonction de membre correcte, à l'exception des fonctions hériter.
struct E {}; static_assert(!HasFoo<E>::value, "E does not have foo.");
3 Réponses :
Voici un moyen de le faire (travailler pour vos 4 cas de test, ne l'a pas testé de manière intensive), merci@ Jarod42 pour l'amélioration (voir la réponse initiale à la fin):
template <typename T> class HasFoo { template <typename C> static int call_foo (int (C::*)(float)); template <typename C> static std::true_type has_foo (decltype(call_foo(&C::foo))); template <typename C> static std::false_type has_foo (...); public: static constexpr bool value = decltype(has_foo<T>(0)){}; };
Merci pour la réponse. J'ai oublié de mentionner: Si la classe n'a pas de foo du tout, elle devrait compiler. Modifier ma question.
@Viatorus J'ai mis à jour ma réponse - ce n'est pas aussi propre que la première version, mais cela pourrait être amélioré.
Voici une ancienne école instancier: p> Notez que, ici, je fournis deux voici un < un href = "http://ideone.com/yo2z4o" rel = "nofollow"> démo avec votre code. p> < Ici, il est supposé que le membre de classe (fonction ou variable ) est choisi, doit être hasmember_foo code> s, 1 avec type et 1 Sans type. Ils sont généralisés pour tout type (pas seulement spécifique à
int (x :: *) (flotteur) code>). S'il n'y a pas de type mentionné, la classe doit avoir seulement 1 méthode (sans surcharge). Par conséquent, il est toujours plus sûr de mentionner le type; Comme vous l'avez fait dans votre question, le type spécifique est
int (x :: *) (flotteur) code>. BTW, cela peut également être inclus en utilisant une autre macro.
Sans une telle macro supplémentaire, en cas de classe C code> et
classe d code>, vous devrez peut-être spécifier le type de méthode. P>
public code> scopé. I.e. Si
x :: FOO code> est
privé code> alors cette solution ne fonctionnera pas. p> p>