zoukankan      html  css  js  c++  java
  • 模板与继承之艺术——奇特的递归模板模式(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,转载请注明出处。
  • 相关阅读:
    网易2019校招C++研发工程师笔试编程题
    牛客网 数串
    ps aux 状态介绍
    阿里在线测评解析
    Ubuntu 18.04安装 Sublime
    file '/grub/i386-pc/normal.mod' not found.解决方案
    解决Windows10与Ubuntu系统时间不一致问题
    进程与线程的区别
    大端模式和小端模式
    2016湖南省赛----G
  • 原文地址:https://www.cnblogs.com/claruarius/p/4111884.html
Copyright © 2011-2022 走看看