您的位置:首页 > 编程语言 > C语言/C++

templates — C++模板的应用<奇特的递归模板模式>

2015-02-04 11:22 225 查看
http://www.verydemo.com/demo_c128_i6615.html

奇特的递归[b]模板模式[/b](CRTP)这个奇特的名字代表了类实现技术中一种通用的模式,即派生类将本身作为[b]模板[/b]参数传递给基类;

CRTP的一个简单的应用是记录某个类的对象构造的总个数。数对象个数很简单,只需引入一个整数类型的静态数据成分,分别在构造与析构中进行递增与递减操作,不过,要在每个类中都这么写非常繁琐,有了CRTP,我们可以写入一个[b]模板[/b]来实现;

实例代码:

查看文本打印?

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: