Wie funktioniert `is_base_of`?

Wie funktioniert der folgende code funktioniert?

typedef char (&yes)[1];
typedef char (&no)[2];

template <typename B, typename D>
struct Host
{
  operator B*() const;
  operator D*();
};

template <typename B, typename D>
struct is_base_of
{
  template <typename T> 
  static yes check(D*, T);
  static no check(B*, int);

  static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes);
};

//Test sample
class Base {};
class Derived : private Base {};

//Expression is true.
int test[is_base_of<Base,Derived>::value && !is_base_of<Derived,Base>::value];
  1. Beachten Sie, dass B privater Basis. Wie funktioniert das?
  2. Beachten Sie, dass operator B*() ist const. Warum ist es wichtig?
  3. Warum ist template<typename T> static yes check(D*, T); besser als static yes check(B*, int); ?

Hinweis: Es ist die reduzierte version (Makros werden entfernt)boost::is_base_of. Und das funktioniert auf Breite Palette von Compilern.

Kommentar zu dem Problem
Es ist sehr verwirrend von Ihnen verwenden den gleichen Bezeichner für eine template-parameter und eine echte Klasse name... Kommentarautor: Matthieu M.
@Matthieu M., ich habe es genommen, auf mich zu korrigieren 🙂 Kommentarautor: Kirill V. Lyadvinsky
Vor einiger Zeit schrieb ich eine alternative Implementierung von is_base_of: ideone.com/T0C1V Es funktioniert nicht mit älteren GCC-Versionen, aber (GCC4.3 gut funktioniert). Kommentarautor: Johannes Schaub - litb
Ok, ich werde einen Spaziergang zu machen. Kommentarautor: jokoon
Diese Implementierung ist nicht korrekt. is_base_of<Base,Base>::value sollte true; dies gibt false. Kommentarautor: chengiz

InformationsquelleAutor der Frage Alexey Malistov | 2010-05-26

Schreibe einen Kommentar