Angenommen man eine Klassenhierarchie hat, ohne Mehrfachvererbung:gemeinsame Basisklasse
struct TOP{};
struct L : TOP{};
struct R : TOP{};
struct LL : L{};
struct LR : L{};
struct RL : R{};
struct RR : R{};
Ist es möglich, eine metafunction zu schreiben, die die Art der gemeinsamen Basis von zwei Typen zurück? (Es könnte void
zurück, wenn nicht gemeinsame Basisklasse existiert.) Zum Beispiel
common_base<RR, R>::type == R
common_base<RL, RR>::type == R
common_base<LL, RR>::type == TOP
common_base<LL, std::string>::type == void
Offensichtlich wäre dies nicht mit mehreren inhertance arbeiten, aber ich bin es in dem einzelnen Vererbungs Fall konzentriert.
Erstens scheint es nicht möglich zu sein ohne eine gewisse Introspektion der Basisklasse. Also, ich habe dies einfaches Problem, tun Sie es so, dass jeder clase seine Basis kennt (durch einen internen base
-Typen), zum Beispiel:
struct LR : L{using base = L;};
Auch auf diese Weise kann ich das metaprogramming scheinen, Recht.
Auch habe ich irgendwo gelesen (ich kann es jetzt nicht finden), dass GCC einige Erweiterungen hat, um gemeinsame Basisklasse zu erkennen. Ist das der Fall?
Würde 'common_base :: type' 'RR' oder' R' sein? –
@JamesRoot, 'RR'. – alfC