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 >
5 Réponses :
Vous pouvez utiliser boost :: is_base_and_derived code> à partir de boost, combiné avec boost_static_assert code>. 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). P>
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 std :: is_base_of code> modèle à l'intérieur.
suivant A Exemple de Stroustrup : en C ++ 0x, cela devient: p>
@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".
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) };
};
plus court est meilleur: exemple 1: p> 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
}
Vérifiez Stackoverflow.com/questions/4532281/...