奇特的递归模板模式(CRTP)这个奇特的名字代表了类实现技术中一种通用的模式,即派生类将本身作为模板参数传递给基类;
CRTP的一个简单的应用是记录某个类的对象构造的总个数。数对象个数很简单,只需引入一个整数类型的静态数据成分,分别在构造与析构中进行递增与递减操作,不过,要在每个类中都这么写非常繁琐,有了CRTP,我们可以写入一个模板来实现;
实例代码:
#include <iostream>
#include <stddef.h>
//CRTP template class object
template <typename CountedType>
class ObjectCounter{
private:
static size_t count;
protected:
ObjectCounter(){
++ObjectCounter<CountedType>::count;
};
ObjectCounter(ObjectCounter<CountedType> const&){
++ObjectCounter<CountedType>::count;
}
~ObjectCounter(){
--ObjectCounter<CountedType>::count;
}
public:
static size_t _live(){
return ObjectCounter<CountedType>::count;
}
};
template <typename CountedType>
size_t ObjectCounter<CountedType>::count = 0;
template <typename CharT>
class MyString : public ObjectCounter<MyString<CharT> >{
};
int _tmain(int argc, _TCHAR* argv[])
{
MyString<char> s1, s2;
MyString<wchar_t> ws;
std::cout << MyString<char>::_live() << std::endl;
std::cout << MyString<char>::_live() << std::endl;
std::cout << MyString<wchar_t>::_live() << std::endl;
getchar();
return 0;
}参考《C++ templates》
本文介绍了一种称为CRTP的通用模式,并通过一个简单的对象计数应用展示了其使用方法。CRTP允许派生类将自身作为模板参数传递给基类,从而实现代码复用。文章还提供了一个C++实现的例子。
427

被折叠的 条评论
为什么被折叠?



