模板與繼承之藝術——奇特的遞歸模板模式(CRTP),遞歸crtp
一、什麼是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,轉載請注明出處。