struct A
{
};
struct B : A
{
virtual ~B() {}
};
template<typename BASE, typename EXTENDED>
void ASSERT_BASE_EXTENDED()
{
static_assert(static_cast<BASE*>((EXTENDED*)256)==(BASE*)256, "error");
}
Je suis à la recherche d'un moyen d'avoir une affirmation de compilation pour vérifier si la classe de base est une base de PROLONGÉE, et ils ont le même adresse mémoire. Dans l'exemple ci-dessus, même si B est basé sur A, lorsqu'il est converti en A, il a une adresse de mémoire différente, car le pointeur de table de fonction virtuelle est en fait le premier membre de B. Mais j'ai besoin de vérifier premier membre Ce qui précède fonctionne bien mais n'est pas à la compilation, car j'obtiens une erreur "erreur C2131: l'expression n'a pas été évaluée comme une constante" lors de l'utilisation du compilateur VS 2017.C++ compilation assert cette base est la classe de base de ETENDU et ont la même adresse mémoire
Je ne m'intéresse pas à "std :: is_base_of" parce que celui-ci ignore la vérification de la même adresse mémoire. Existe-t-il un autre moyen de le faire?
Merci
Vous voulez utiliser le [_CRTP_] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) et 'static_cast'? – user0042
Le CRTP est un concept intéressant mais l'objectif est de ne pas modifier les classes existantes et d'ajuster uniquement la fonction ASSERT_BASE_EXTENDED. – Esenthel