程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 模板與繼承之藝術——奇特的遞歸模板模式(CRTP),遞歸crtp

模板與繼承之藝術——奇特的遞歸模板模式(CRTP),遞歸crtp

編輯:C++入門知識

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved