zoukankan      html  css  js  c++  java
  • 感悟ATL风格的模板

    很久以前就喜欢上了模板编程,当接触到ATL风格的模板时更是觉得惊艳。典型的ATL模板如下所示:
    template< typename TDerive >
    class  CBaseT
    {
    public:
        
    void  InitBaseMethod()
        {
            TDerive 
    *pThis = static_cast<TDerive*>this );
            pThis
    ->InitDeriveMethod();
        }
    };

    class  CDerive : public CBaseT< CDerive >
    {
    public:
        
    void  InitDeriveMethod()
        {
            AtlMessageBox( NULL, _T(
    "CDerive::InitDeriveMethod") );
        }
    };

    这种风格我到现在看来还是觉得很疯狂,用派生类作为基类的模板参数,我想实作出这样代码的牛人当时肯定处于暴走状态啊,也许真正的牛人每天都处于我所理解的暴走状态的.

    作为一个小小程序员,我没有这样的创意,但我能模仿,能经常在自己的程序中应用.不过,最近我有研究ATL的源码(COM实现),才发现我连运用也用的不够彻底.这种风格的模板完全可以实现在一个基类中调用另一个基类的方法。我也不知道我这种惊奇在各位大侠看来是不是有点鸡肋.可能是我的变通能力差吧.

    class  CBaseOther
    {
    public:
        
    void  InitBaseOther()
        {
            AtlMessageBox( NULL, _T(
    "CBaseOther::InitBaseOther") );
        }
    };

    template
    < typename TDerive >
    class  CBaseT
    {
    public:
        
    void  InitBaseMethod()
        {
            TDerive 
    *pThis = static_cast<TDerive*>this );

            
    //调用CBaseOther的InitBaseOther方法
            pThis->InitBaseOther();
        }
    };

    class  CDerive : public CBaseT< CDerive >public CBaseOther
    {
    public:
        
    void  InitDeriveMethod()
        {
            AtlMessageBox( NULL, _T(
    "CDerive::InitDeriveMethod") );
        }
    };
    唯一的遗憾就是对于派生类重写过的虚方法,在模板基类中就没有办法调用到基类相应的虚方法了.毕竟模板基类和别的基类之间不存在继承关系
  • 相关阅读:
    HTTP Caching
    有关缓存的那些事 读 PHP高级编程
    用embercli 学习搭建了todoMVC
    redis数据结构开篇
    linux最小安装后进行的操作
    redis数据结构整数集合
    redis数据结构动态字符串(SDS)
    redis数据结构压缩列表
    redis数据结构字典
    redis数据结构跳跃表
  • 原文地址:https://www.cnblogs.com/fangkm/p/1441156.html
Copyright © 2011-2022 走看看