Contents

我上一篇博客C++的静态分发(CRTP)和动态分发(虚函数多态)的比较介绍了如何用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
Contents