7
votes

Type Trait: Vérifiez si la classe a une fonction spécifique (peut-être hériter)

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.");


0 commentaires

3 Réponses :


4
votes

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)){};
};


2 commentaires

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é.



3
votes

Voici une ancienne école C ++ 03 façon de le faire. Typiquement, il peut être utilisé comme utilitaire et l'obtenir moulé pour tout méthode ou variable . xxx

instancier: xxx

Utilisation : xxx

Notez que, ici, je fournis deux hasmember_foo s, 1 avec type et 1 Sans type. Ils sont généralisés pour tout type (pas seulement spécifique à int (x :: *) (flotteur) ). 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) . BTW, cela peut également être inclus en utilisant une autre macro.
Sans une telle macro supplémentaire, en cas de classe C et classe d , vous devrez peut-être spécifier le type de méthode.

voici un < un href = "http://ideone.com/yo2z4o" rel = "nofollow"> démo avec votre code. <


Ici, il est supposé que le membre de classe (fonction ou variable ) est choisi, doit être public scopé. I.e. Si x :: FOO est privé alors cette solution ne fonctionnera pas.


0 commentaires

1
votes

Voici une solution avec ou < Code> xxx


0 commentaires