模板与继承之艺术——奇特的递归模板模式(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,转载请注明出处。

时间: 2024-10-22 07:51:34

模板与继承之艺术——奇特的递归模板模式(CRTP)的相关文章

模板与继承之艺术——空基类优化

1.概念 C++中有“空”类的概念,这就意味着在运行期间其内部不好任何内存. 只包含类型的成员函数.非虚成员函数和静态数据成员的类为空类. 非静态的数据成员,虚函数和虚基类则在运行时期消耗存储空间. 2.空基类优化如下: #include<iostream> using namespace std; class Empty{ typedef int Int; }; class EmptyToo : public Empty {}; class EmptyThree : public Empty

模板与继承之艺术——命名模板参数

一.命名模板参数 许多模板技术拖着一长串的类型参数,不过很多参数都设有合理的缺省值. template<typename Policy1 = DefaultPolicy1, typename Policy2 = DefaultPolicy2, typename Policy3 = DefaultPolicy3, typename Policy4 = DefaultPolicy4> class BreadSlicer{}; 但是如果我们需要指定某个非缺省实参,还必须明确的指定在它之前的所有实参,

模板类继承模板类

今天写的代码提交到OJ上就出现这样的错误,但是vs并不会出错. '_elem' was not declared in this scope 原因在于模板类继承模板类,子类看不见父类的成员. 但是VC++做了一些小拓展,可以不适用this->就调用父类成员. gcc在扫描到模板类时就要求确定每一个成员在哪里声明的,VC++在类实例化之后再检测,就不会有这个问题. 可以使用以下方式解决: 方法1: 使用this template<typename T> class A { protecte

Template 模板的继承

index.html {% extends "base.html" %} {% block content %} <h1>Hi, {{user.nickname}}!</h1> {% for post in posts %} <div><p>{{post.author.nickname}} says: <b>{{post.body}}</b></p></div> {% endfor %} {

模板的继承

会用继承,会用一些模板, 但是模板的继承是什么鬼: 百度如下: 模板类的继承包括四种: 1.(普通类继承模板类) template<class T> class TBase{ T data; …… }; class Derived:public TBase<int>{ …… }; 2.(模板类继承了普通类(非常常见)) class TBase{ …… }; template<class T> class TDerived:public TBase{ T data; ……

模板的继承和导入

模板的继承: 模板(名为master.html): <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}{% endblock %}</title> <link rel="stylesheet" href="#"> .. &

python的Web框架,模板标签及模板的继承

模板标签 在传递数据的时候,会有大量的数据展示在浏览器上,而数据会是动态变化的,在html的编写中,数据也是需要动态的,而不能是写死的,如果动态展示呢. 给定的例子数据 views传递数据给html 1 from django.shortcuts import render 2 3 def index(request): 4 5 students = [ 6 {'id':12, 'name':'张三', 'age':19, 'sex':'男'} 7 {'id':22, 'name':'李思',

模板标签及模板的继承与引用

模板标签及模板的继承与引用 一.模板标签 定义:标签在渲染的过程中提供任意的逻辑 语法:由 {%    %} 来定义的 例:1.循环列表数据 2.如果要判断性别的女的,背影色为黄色,否则为红色 3.如果要加序号 4.如果电话号码为空时,显示未填 {% for student in students %} <tr  {% if student.sex == "女" %}style = "background-color : yellow "    {% else

Django Template模板层 (下) ----------- 过滤器、人性化过滤器、模板继承、模板加载

---恢复内容开始--- 过滤器 除了模板标签可以帮助我们对数据或者进行逻辑处理.django 中还提供了一款工具叫做过滤器,过滤器也可以实现一些模板变量的运算,判断或是其他逻辑处理. add 语法: {{ var1|add:var2 }} add 过滤器可以实现 var1 与 var2 的相加,并且在遇到其他相同数据类型的,比如列表时,加号还可以重载为拼接功能 过滤器首先会将数据转换成Int类型,进行相加,如果转换失败,则会尝试使用 Python 中的数据类型 列表.元祖等这样的数据类型来进行