Je me demande s'il existe un moyen de savoir si une classe est une base directe d'une autre classe, c'est-à-dire, en termes de trait de type Boost, une fonction is_direct_base_of
. Pour autant que je puisse le voir, Boost ne semble pas supporter ce genre de fonctionnalité, ce qui m'amène à penser que c'est impossible avec le standard C++ actuel.Existe-t-il un moyen de savoir si une classe est une base directe d'une autre classe?
La raison pour laquelle je le souhaite est de faire une vérification de validation sur deux macros utilisées pour un système de réflexion afin de spécifier qu'une classe est dérivée d'une autre, comme dans l'exemple de code ci-dessous.
header.h:
#define BASE A
#define DERIVED B
class A {};
class B : public A
{
#include <rtti.h>
};
rtti.h:
// I want to check that the two macro's are correct with a compile time assert
Rtti<BASE, DERIVED> m_rtti;
Bien que les macros semblent inutiles dans cet exemple simple, dans mon vrai scénario monde rtti.h
est beaucoup plus complexe. Une voie possible serait de comparer la taille de ce pointeur avec la taille d'un pointeur de ce pointeur au type de base et en essayant en quelque sorte de déterminer si c'est la taille de la classe de base elle-même ou quelque chose. (Ouais, vous avez raison, je ne sais pas comment ça marcherait non plus!)
'Derived :: dérivé(): Base() {}' est aussi valide si 'Base' est une classe de base virtuelle non-directe - ce cas pourrait-il être éliminé avec (encore un autre) test? +1 de toute façon. –
Bon point, j_random_hacker, c'est assez intelligent (ou mal!). Je ne sais pas comment résoudre ce "problème", mais j'espère que c'est assez d'une chose pathologique qui n'a pas vraiment besoin d'être traitée (C++ étant un langage où les mal intentionnés peuvent faire n'importe quoi) . –
Je suis d'accord, c'est un cas pathologique que vous n'avez pas besoin de perdre votre sommeil. J'y ai pensé parce que j'ai déjà vu une astuce pour empêcher une dérivation supplémentaire d'une classe (c'est-à-dire la forcer à être une "feuille") qui a également été subvertie par l'héritage virtuel. VI est vraiment un peu un hack de conception de langage - par exemple. Une classe de base virtuelle 'operator =()' sera appelée un nombre indéterminé de fois où un objet de la classe dérivée est assigné. –