以下代码如何工作?
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];
请注意,这
B
是私有基础。这是如何运作的?注意这
operator B*()
是常量。它为什么如此重要?为什么
template<typename T> static yes check(D*, T);
优于static yes check(B*, int);
?
注意:它是的简化版本(删除了宏)boost::is_base_of
。这适用于各种编译器。
is_base_of
:ideone.com/T0C1V它虽然(GCC4.3正常工作)不与旧版本的GCC工作。
is_base_of<Base,Base>::value
应该是true
; 这又回来了false
。