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;
}
奇特的递归[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;
}
相关文章推荐
- templates — C++模板的应用<奇特的递归模板模式>
- C++ 模板:奇特递归模板模式(Curiously Recurring Template Pattern -CRTP)和 静多态(Static polymorphism)
- <设计模式>系列汇总 By python and C++
- (Boolan)C++设计模式 <六> ——桥模式(Bridge)
- 浅学设计模式之观察者<Observer>模式及在android中的应用 .
- <C/C++ 版> 设计模式 学习之 策略模式
- C++:<sstream>头文件的应用
- <C++ 实现设计模式> 观察者模式
- 《大话设计模式》--考题抄错会做也白搭--模板方法模式<TemplateMethod>(10)
- Nop-Fluent+AutoFAC模式在ASP.NET MVC中的应用场景<四>
- <C++ 实现设计模式> 观察者模式
- <C/C++ 版> 设计模式 学习之 工厂模式 <2>
- (Boolan)C++设计模式 <五> ——装饰模式(Decorator)
- Freemarker模板应用 <转载自http://blog.csdn.net/zgmzyr/article/details/7304220>
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- (Boolan)C++设计模式 <四> ——观察者模式(Observer)
- Java笔记2 面向对象<3>final关键字、抽象类、模板方法模式、接口
- (Boolan)C++设计模式 <三> ——策略模式(Strategy)
- (Boolan)C++设计模式 <一> ——设计模式简介以及面向对象设计原则
- (Boolan)C++设计模式 <二> ——模版方法(Template Method)