templates — C++模板的应用<奇特的递归模板模式>
2012-12-30 11:27
591 查看
奇特的递归模板模式(CRTP)这个奇特的名字代表了类实现技术中一种通用的模式,即派生类将本身作为模板参数传递给基类;
CRTP的一个简单的应用是记录某个类的对象构造的总个数。数对象个数很简单,只需引入一个整数类型的静态数据成分,分别在构造与析构中进行递增与递减操作,不过,要在每个类中都这么写非常繁琐,有了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》
相关文章推荐
- templates — C++模板的应用<奇特的递归模板模式>
- (Boolan)C++设计模式 <九> ——单例模式(Singleton)和享元模式(FlyWeight)
- <C/C++ 版> 设计模式 学习之 策略模式
- <C/C++ 版> 设计模式 学习之 工厂模式 <1>
- (Boolan)C++设计模式 <十> ——状态模式(State)和备忘录(Memento)
- <C++学习笔记>函数模板 template
- C++:<sstream>头文件的应用
- (Boolan)C++设计模式 <十一> ——组合模式(Composite)、迭代器(Iterator)和责任链(Chain of Resposibility)
- <C/C++ 版> 设计模式 学习之 策略模式+工厂模式
- 《大话设计模式》--考题抄错会做也白搭--模板方法模式<TemplateMethod>(10)
- (Boolan)C++设计模式 <十二> ——命令模式(Command)和访问器(Visitor)
- <C++ 实现设计模式> 观察者模式
- Nop-Fluent+AutoFAC模式在ASP.NET MVC中的应用场景<四>
- (Boolan)C++设计模式 <十三> ——解析器(Interpreter)
- Java笔记2 面向对象<3>final关键字、抽象类、模板方法模式、接口
- Nop-Fluent+AutoFAC模式在ASP.NET MVC中的应用场景<四>
- 关于c++中模板 T 无法限制的替代方案template< T extends Base>
- JAVA设计模式(14) —<行为型>模板方法模式(Template Method)
- <C/C++ 版> 设计模式 学习之 工厂模式 <2>
- C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)