- 论坛徽章:
- 2
|
回复 #6 apple753357 的帖子
原帖由 apple753357 于 2009-8-2 03:42 发表 ![]()
#include <iostream>
using namespace std;
template<class T, class U>
class IsBaseClass {
typedef char ONE;
typedef struct { char dummy[2];} TWO;
static ONE test1(U); // Testing can T be converted to U.
static TWO test1(...);
enum { IsConvert = sizeof( test1(T()) ) == sizeof(ONE) };
static ONE test2(int T::* ); // testing is T a class type.
static TWO test2(...);
enum { IsClass = sizeof( test2(0) ) == sizeof(ONE) };
public:
enum { YES = IsConvert && IsClass };
};
#define IsBase(T, U) IsBaseClass<T, U>::YES
class Base{};
class Derived : public Base {int a_;};
class T{};
int main (int argc, char *argv[]) {
cout << IsBase(Derived, Base) <<"\n";
return 0;
}
1. static ONE test1(U); // Testing can T be converted to U.
struct A {};
struct B { B(A) {} };
struct C { operator A() const { return A(); } };
IsBase(A, B)
B不是内建类型, A能隐式转换到B, 但显然A不是B的子类。
IsBase(C, A)
A不是内建类型, C能隐式转换到B, 但显然C不是A的子类。
2. test1(T())
T不一定有无参数的构造函数。即使有,也不一定可访问。 |
|