美文网首页
奇异递归模板模式 (CRTP, Curiously Recurr

奇异递归模板模式 (CRTP, Curiously Recurr

作者: fck_13 | 来源:发表于2020-09-02 12:58 被阅读0次

这个名字念起来有些拗口,先看一下代码示例:

// The Curiously Recurring Template Pattern (CRTP)
template<class T>
class Base{
    // methods within Base can use template to access members of Derived
};
class Derived : public Base<Derived>{
    // ...
};

这是CRTP一个最基本的形式,可以看出,将派生类作为基类的模板参数,意味基类可以访问派生类的一些内容,这也是名字中为什么会有递归两个字的原因。

下面是一些CRTP的使用示例:

静态多态

template <class T>
struct Base{
    void interface(){
        static_cast<T*>(this)->implementation();
    }

    static void static_func(){
        T::static_sub_func();
    }
};

struct Derived : Base<Derived>
{
    void implementation(){
    }
    static void static_sub_func();
};

void Derived::static_sub_func(){
}

int main(){
    Derived d{};
    d.static_func();
    return 0;
}

代码注入

template <typename T>
struct counter{
    static int objects_created;
    static int objects_alive;

    counter(){
        ++objects_created;
        ++objects_alive;
    }

    counter(const counter&){
        ++objects_created;
        ++objects_alive;
    }

    ~counter(){ // objects should never be removed through pointers of this type
        --objects_alive;
    }
};
template <typename T> int counter<T>::objects_created( 0 );
template <typename T> int counter<T>::objects_alive( 0 );

struct MyClass : public counter<MyClass>
{};

int main(){
    MyClass h{};
    {
        MyClass a{};
        MyClass c{};
        MyClass d{};
    }
    return MyClass::objects_alive;
}

单例模式

#include <memory>

template <class ActualClass>
class Singleton{
public:
    static ActualClass& GetInstance(){
       if(p == nullptr)
         p = std::unique_ptr<ActualClass>(new ActualClass);
       return *p;
     }

   protected:
    Singleton() = default;
    static std::unique_ptr<ActualClass> p;
};
template <class T>
std::unique_ptr< T > Singleton<T>::p;

class A: public Singleton<A>
{
};

int main(){
    auto& i = A::GetInstance();
}

最佳实践

namespace detail{
    template <class T>
    class Base{
    public:
        void interface()
        {
            // ...
            self()->implementation();
            // ...
        }
    private:
        T* self(){
            return static_cast<T*>(this);
        }
        // methods within Base can use template to access members of Derived
    };
};

class Derived : public detail::Base<Derived>{
public:
    void implementation(){
        // do something
    }
    // ...
};

int main(){
    Derived d;
    d.interface();
}

C++ 库中,std::shared_ptr中的std::enable_shared_from_this使用了CRTP.

相关文章

  • 奇异递归模板模式 (CRTP, Curiously Recurr

    这个名字念起来有些拗口,先看一下代码示例: 这是CRTP一个最基本的形式,可以看出,将派生类作为基类的模板参数,意...

  • 奇异递归模板模式(Curiously Recurring Tem

    奇异递归模板模式(Curiously Recurring Template Pattern) 奇异递归模板模式(C...

  • C++雾中风景14:CRTP, 模板的黑魔法

    CRTP,奇特的递归模板模式 (Curiously Recurring Template Pattern) 是 C...

  • CRTP

    这篇文章介绍了什么是CRTP(奇异的递归模板模式)原文stackflow上讨论了CRTP问题 我的理解 简而言之,...

  • Fluent C++:奇异递归模板模式(CRTP)

    原文 CRTP是一个C++惯用法。Jim Coplien在1995年,早期的C++模板编程中将其命名为CRTP。 ...

  • Fluent C++:Mixin类——CRTP的阳面

    原文 既然我们已经清楚了CRTP的工作原理,那么让我与你分享另一种涉及模板的技术,该模板是CRTP的补充:Mixi...

  • 动态规划

    一、分治,回溯,递归,动态规划 1.1、递归的代码模板 1.2、分治(Divide & Conquer)的代码模板...

  • C++11 模板元编程 - 模板递归

    模板可以被递归调用,在模板递归的过程中,可以执行前面我们提到的两种编译期计算:数值计算和类型计算。 下面我们用模板...

  • 递归

    本文主要内容有: 1、递归的样子2、递归简介3、递归特点4、递归分析方法5、递归程序模板6、递归程序调试7、总结8...

  • C++11 模板元编程 - 递归

    函数式语言依赖模式匹配和递归完成类似命令式语言里分支选择和循环迭代的功能。模板元编程中可以完成模式匹配的两种方式上...

网友评论

      本文标题:奇异递归模板模式 (CRTP, Curiously Recurr

      本文链接:https://www.haomeiwen.com/subject/cjwprktx.html