• 用CRTP在C++中实现静态函数的多态



    我上一篇博客[C++的静态分发(CRTP)和动态分发(虚函数多态)的比较](http://www.cnblogs.com/fresky/p/3504241.html)介绍了如何用CRTP(Curiously Recurring Template Pattern)实现静态分发,今天再讲另外一个CRTP的例子。在C++中静态函数是不能设成virtual的,但是用CRTP可以实现静态函数的多态。

    先看代码:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    template<typename Derived>  class Parent 
    {
    public:
        void SayHi()
        {
            static_cast<Derived*>(this)->SayHiImpl();
        }
        void static SayHiStatic()
        {
            Derived::SayHiStatic();
        }
    private:
        void SayHiImpl()
        {
            cout << "hi, i'm default!" << endl;
        }
    };
    
    class ChildA :public Parent<ChildA>
    {
    public:
        void SayHiImpl()
        {
            cout << "hi, i'm child A!" << endl;
        }
        void static SayHiStatic()
        {
            cout << "Static hi from Child A" << endl;
        }
    };
    
    class ChildB :public Parent<ChildB>
    {
    public:
        void static SayHiStatic()
        {
            cout << "Static hi from Child B" << endl;
        }
    };

    和上次的代码类似,这次父类有一个静态的interface,两个子类分别实现了自己的静态实现。

    再看调用静态 interface 的函数和 main 函数。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    template<typename Derived> void CRTP(Parent<Derived>& p)
    {
        p.SayHiStatic();
    }
    
    int _tmain(int argc, TCHAR* argv[])
    {
        ChildA a;
        CRTP(a);
        cout << "size of ChildA: " << sizeof(a) << endl;
    
        ChildB b;
        CRTP(b);
        cout << "size of ChildB: " << sizeof(b) << endl;
    
        return 0;
    }

    运行可以得到如下输出:

    1
    2
    3
    4
    Static hi from Child A
    size of ChildA: 1
    Static hi from Child B
    size of ChildB: 1
  • 相关阅读:
    sort函数的运用
    数据库设计三大范式
    LeetCode 64. 求1+2+…+n
    LeetCode 876. 链表的中间结点
    单链表的创建和基本操作 C语言
    LeetCode 365. 水壶问题
    LeetCode 1160. 拼写单词
    LeetCode 409. 最长回文串
    LeetCode 836. 矩形重叠
    LeetCode 7. 整数反转
  • 原文地址:https://www.cnblogs.com/fresky/p/3506975.html
Copyright © 2020-2023  润新知