最近看到一篇C++ 好文,推荐给大家。如果可以阅读英文,可以直接阅读原文 https://www. drdobbs.com/cpp/countin g-objects-in-c/184403484
“Counting Objects in C++",这技法被用于智能指针的enable_shared_from_this
当我们希望可以从一个指针获得它的shared_ptr, 的时候,我们需要将这个对象继承自enable_shared_from_this,
class Book: public std::enable_shared_from_this<Book> {
public:
shared_ptr<Book> shared_this() {
return std::shared_from_this();
刚开始看这个感觉有点难理解——为什么Book可直接继承 enable_shared_from_this<Book> ?
Book
这时候不是还没有定义好, 应该属于incomplete type呀。
后面才知道这样用法叫CRTP,curiously recurring template pattern。(个人觉得这个名字起的不好,不能让人见名思义)
首先提一下incomplete type。
incomplete type常出现于forward declaration。比如
class Book;
Book *ip = nullptr;
Book *ip_fail = new Book() //这一行会报错, Book 是incomplete type。