11
votes

Vérifiez si l'argument de modèle est hérité de la classe

Je veux vérifier si le type donné à un modèle est hérité d'une classe de base de mon projet.

Il devrait fonctionner comme on s'attendrait à celui de l'exemple suivant: P>

template< class T : public CBaseClass >
  • est-il possible de le faire avec des modèles, sinon, comment puis-je le faire? LI> ul> p>


5 Réponses :


12
votes

Vous pouvez utiliser boost :: is_base_and_derived à partir de boost, combiné avec boost_static_assert . Si vous utilisez un compilateur avec le support TR1 ou C ++ 0x, il existe des équivalents de ces constructions dans la bibliothèque standard ( std :: is_base_of et static_assert Déclaration en C ++ 0x).


4 commentaires

Je ne suis pas autorisé à utiliser Boost, malheureusement


@Oktstrom: quel compilateur utilisez-vous? Est-ce qu'il prend en charge TR1 ou C ++ 0x?


J'utilise le compilateur fourni avec Visual Studio 2010


Voyez si vous avez la en-tête et le std :: is_base_of modèle à l'intérieur.



0
votes

Je suppose que c'est à peu près problème non. 3 de Cet article gotw .


0 commentaires

14
votes

suivant A Exemple de Stroustrup : xxx

en C ++ 0x, cela devient: xxx


1 commentaires

@Crazyeddie: Compte tenu de l'échantillon de code dans la question, je pense que l'op signifie "affirmer" par "chèque" plutôt que "faire x si c, sinon y".



6
votes

Si vous voulez affirmer, faites-le de Nurk. Si vous souhaitez vérifier, utilisez IS_BASE_OF à partir de BOOST ou C ++ 0x. Si vous ne pouvez pas utiliser l'une ou l'autre de ceux-ci, utilisez SFAINE:

template < typename Base, typename PotentialDerived >
struct is_base
{
  typedef char (&no)  [1];
  typedef char (&yes) [2];

  static yes check(Base*);
  static no  check(...);

  enum { value = sizeof(check(static_cast<PotentialDerived*>(0))) == sizeof(yes) };
};


0 commentaires

0
votes

plus court est meilleur: xxx pré>

exemple 1: p> xxx pré>

exemple 2: p>

template <bool, typename T=void>
struct Use {
    static std::string info() { return "Implementation that consider that A is not base of B"; }
};

template <typename T>
struct Use<true,T>  {
    static std::string info() { return "Implementation that consider that A is the base of B"; }
};


int main(void) {
    std::cout << Use<is_base<A,B>::value>::info(); //Implementation that consider that A is the base of B
}


0 commentaires