template <typename BASE, typename DERIVED>
struct TypeResolver
{
template <typename TYPE>
static Yes ResolvedType(DERIVED const volatile*, TYPE);
static No ResolvedType(BASE const volatile*, int);
};
template<typename BASE, typename DERIVED>
struct IsDerivedInternal
{
struct TypeCaster
{
operator BASE const volatile* () const;
operator DERIVED const volatile* ();
};
static const bool Result = (sizeof(TypeResolver<BASE, DERIVED>::ResolvedType(TypeCaster(), 0)) == sizeof(Yes));
};
解释:
首先,const成员函数举例:
class Person
{
public:
int age;
void say() const
{
cout << "Person say" << endl;
}
void say()
{
cout << "xaaa" << endl;
}
}
上面的say构成重载关系。调用规则如下:
1、非const对象,优先调用非const方法;
举例:
class Person
{
public:
int age;
void say() const
{
cout << "const say" << endl;
}
void say()
{
cout << "non const say" << endl;
}
};
int main()
{
Person p;
p.say(); //调用void say()
}
2、const对象优先调用const成员函数:
int main()
{
const Person p;
p.say(); //调用:void say() const
}
再举例:
template<typename BASE, typename DERIVED>
struct IsDerivedInternal {
struct TypeCaster {
operator BASE * () const
{
BASE b;
return &b;
}
operator DERIVED * () //无const
{
DERIVED d;
return &d;
}
};
public:
BASE* Say() //Say返回的是基类的指针
{
return TypeCaster();
}
};
class A
{
};
class B:public A
{
};
int main()
{
IsDerivedInternal<A, B> x;
x.Say();
return 0;
}
当A和B有继承关系的时候,优先调用:operator DERIVED * () ,因为其无const。
这也就解释了:BASE和DERIVED具有继承关系的时候,返回的是:operator DERIVED const volatile* ();
因为优先调用这个无const的转换函数。
struct IsDerivedInternal {
struct TypeCaster {
operator BASE const volatile* () const;
operator DERIVED const volatile* ();
};
……
TypeResolver<BASE, DERIVED>::ResolvedType(TypeCaster(), 0)
也就匹配了:
template <typename TYPE>
static Yes ResolvedType(DERIVED const volatile*, TYPE);
所以返回的Result为1
static const bool Result = (sizeof(TypeResolver<BASE, DERIVED>::ResolvedType(TypeCaster(), 0)) == sizeof(Yes));