模板与继承之艺术——奇特的递归模板模式(CRTP)
2014-11-21 00:39
375 查看
一、什么是CRTP
奇特的模板递归模式(Curiously Recurring Template Pattern)即将派生类本身作为模板参数传递给基类。
template<typename T>
class BaseT{};
class D : public BaseT<D>{};
类D是一个非依赖型基类,不是模板。
(1)被继承的类模板(BaseT)的模板参数(T)可以是模板参数,
template<typename T>
class BaseT{};
template<typename T>
class D : public BaseT<D<T> >{};
(2)被继承的类模板(BaseT)的模板参数(T)可以是模板
typename<template<typename> class T>
class BaseT{};
template<typename T>
class D : public BaseT<D>{};
二、CRTP的一个简单应用就是记录某个类对象构造的总个数。
#include<stddef.h>
#include<iostream>
template<typename CountedType>
class ObjectCounter{
static size_t count;
protected:
ObjectCounter(){ ++ObjectCounter<CountedType>::count; } //声明为protected,防止生成对象,限定只能被继承
ObjectCounter(const ObjectCounter<CountedType>& ){ ++ObjectCounter<CountedType>::count; }
~ObjectCounter(){ --count; }
public:
static size_t getCount(){ return ObjectCounter<CountedType>::count; }//作为静态函数,类方法
};
template<typename CountedType>
size_t ObjectCounter<CountedType>::count = 0;
template<typename T>
class MyString : public ObjectCounter<MyString<T> >{}; //CRTP
int main()
{
MyString<char> s1, s2;
MyString<wchar_t> ws;
std::cout << "MyString<char>:"<< MyString<char>::getCount()<< std::endl; //输出2
std::cout << "MyString<wchar_t>:"<< MyString<wchar_t>::getCount() << std::endl; //输出1
}
编辑整理:Claruarius,转载请注明出处。
奇特的模板递归模式(Curiously Recurring Template Pattern)即将派生类本身作为模板参数传递给基类。
template<typename T>
class BaseT{};
class D : public BaseT<D>{};
类D是一个非依赖型基类,不是模板。
(1)被继承的类模板(BaseT)的模板参数(T)可以是模板参数,
template<typename T>
class BaseT{};
template<typename T>
class D : public BaseT<D<T> >{};
(2)被继承的类模板(BaseT)的模板参数(T)可以是模板
typename<template<typename> class T>
class BaseT{};
template<typename T>
class D : public BaseT<D>{};
二、CRTP的一个简单应用就是记录某个类对象构造的总个数。
#include<stddef.h>
#include<iostream>
template<typename CountedType>
class ObjectCounter{
static size_t count;
protected:
ObjectCounter(){ ++ObjectCounter<CountedType>::count; } //声明为protected,防止生成对象,限定只能被继承
ObjectCounter(const ObjectCounter<CountedType>& ){ ++ObjectCounter<CountedType>::count; }
~ObjectCounter(){ --count; }
public:
static size_t getCount(){ return ObjectCounter<CountedType>::count; }//作为静态函数,类方法
};
template<typename CountedType>
size_t ObjectCounter<CountedType>::count = 0;
template<typename T>
class MyString : public ObjectCounter<MyString<T> >{}; //CRTP
int main()
{
MyString<char> s1, s2;
MyString<wchar_t> ws;
std::cout << "MyString<char>:"<< MyString<char>::getCount()<< std::endl; //输出2
std::cout << "MyString<wchar_t>:"<< MyString<wchar_t>::getCount() << std::endl; //输出1
}
编辑整理:Claruarius,转载请注明出处。
相关文章推荐
- C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)
- C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)
- C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)
- C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)
- C++ 模板:奇特递归模板模式(Curiously Recurring Template Pattern -CRTP)和 静多态(Static polymorphism)
- STL源码剖析 05 基础-CRTP奇特的递归模式模板 子类作为父类的模板参数
- 奇特递归模板模式
- templates — C++模板的应用<奇特的递归模板模式>
- 类对象引用计数使用模板实现(奇特的递归模板模式)
- 奇特递归模板模式
- templates — C++模板的应用<奇特的递归模板模式>
- C++惯用法:奇特的递归模板模式
- 编程艺术之模板方法模式
- 模板与继承之艺术——空基类优化
- 别样JAVA学习(五)继承上(0.1)抽象类和模板方法模式
- 黑马程序员4. 继承&覆盖&final&抽象&模板方法模式&接口
- day07继承,子父类中成员的特点,方法的覆盖,子父类中的构造函数,final,抽象类,模板方法模式。 接口
- 不需要继承实现模板模式
- 模板方法模式之抽象类继承
- 黑马程序员-JAVASE入门(抽象类、继承、模板设计模式)