c++CRTP和typename与class的区别233

Curiously Recurring Template Prattern即人们称的静态多态
由于c++的多态不能将基类的虚函数定义为模板函数,所以出现的它

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
40
41
42
43
44
template<typename T>
class BaseClass
{
public:
template<typename D>
void Func(D t)
{
static_cast<T&>(*this).funcImpl(t);
}
private:
template<typename T>
void funcImpl(T f)
{
cout << "Base class" << f << endl;
}
};
class Base : public BaseClass<Base>
{
};
class Derive : public BaseClass<Derive>
{
public:
template<typename T>
void funcImpl(T f)
{
cout << "Derive class" << f << endl;
}
};
int main(void) {
BaseClass<Derive> der;
der.Func(2);//base 2
BaseClass<Base> bas;
bas.Func(4);//derive 4
system("pause");
return 0;
}

如此,多态就能使用模板函数了


怕是最近js写多了,这个都忘了,羞愧啊!!

1
2
3
4
5
template <class T>
class MyClass{
typename T::SubType * ptr;
...
};

在这里,typename指出SubType是class T中定义的一个类别,因此ptr是一个指向T::SubType型别的指针。如果没有关键字typename,SubType会被当成一个static成员,于是
T::SubType * ptr
会被解释为型别T内的数值SubType与ptr的乘积。


// //