比如类定义如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #include <memory>
#include <iostream>
using namespace std;
class BaseA
{
public:
int i_;
};
class ChildA //: public BaseA
{
public:
int i_;
}; |
#include <memory>
#include <iostream>
using namespace std;
class BaseA
{
public:
int i_;
};
class ChildA //: public BaseA
{
public:
int i_;
};
如下的方法只会报编译错误
1
2
3
4
5
6
7
8
9
| ChildA *a = (ChildA *)1;
if (NULL == static_cast<BaseA*>(a))
{
cout << "ChildA does not inherit from BaseA 2." << endl;
}
else
{
cout << "ChildA inherits from BaseA 2." << endl;
} |
ChildA *a = (ChildA *)1;
if (NULL == static_cast<BaseA*>(a))
{
cout << "ChildA does not inherit from BaseA 2." << endl;
}
else
{
cout << "ChildA inherits from BaseA 2." << endl;
}
如下的方法才能编译中自动检查类的继承性并作相应处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| template<class T, class = void>
struct IsFromBaseA : false_type {};
template<class T>
struct IsFromBaseA<T, void>
: is_convertible<T*, BaseA*>::type {};
int main()
{
if constexpr (conjunction_v<IsFromBaseA<ChildA>>)
{
cout << "ChildA inherits from BaseA." << endl;
}
else
{
cout << "ChildA does not inherit from BaseA." << endl;
}
return 1;
} |
template<class T, class = void>
struct IsFromBaseA : false_type {};
template<class T>
struct IsFromBaseA<T, void>
: is_convertible<T*, BaseA*>::type {};
int main()
{
if constexpr (conjunction_v<IsFromBaseA<ChildA>>)
{
cout << "ChildA inherits from BaseA." << endl;
}
else
{
cout << "ChildA does not inherit from BaseA." << endl;
}
return 1;
}
这是enable_shared_from_this实现的基础。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #include <memory>
using namespace std;
class Aa : public enable_shared_from_this<Aa> // 'public' is necessary.
{
public:
shared_ptr<Aa> retThis()
{
return shared_from_this();
}
};
int main()
{
shared_ptr<Aa> p1 = make_shared<Aa>();
shared_ptr<Aa> p2 = p1->retThis();
p2.reset();
p1.reset();
return 0;
} |
#include <memory>
using namespace std;
class Aa : public enable_shared_from_this<Aa> // 'public' is necessary.
{
public:
shared_ptr<Aa> retThis()
{
return shared_from_this();
}
};
int main()
{
shared_ptr<Aa> p1 = make_shared<Aa>();
shared_ptr<Aa> p2 = p1->retThis();
p2.reset();
p1.reset();
return 0;
}
当p1在构造时,会检查Aa是否是enable_shared_from_this派生的类,如果是,则在enable_shared_from_this类中维护一个引用计数;如果不是enable_shared_from_this派生的,则在shared_ptr类中维护一个引用计数。