¿Cómo funciona `is_base_of`?
¿Cómo funciona el siguiente código?
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];
Tenga en cuenta queB
Es base privada. ¿Como funciona esto?
Tenga en cuenta queoperator B*()
es constante ¿Por qué es importante?
Por que estemplate<typename T> static yes check(D*, T);
mejor questatic yes check(B*, int);
?
Nota: Es una versión reducida (se eliminan las macros) deboost::is_base_of
. Y esto funciona en una amplia gama de compiladores.