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") );
        }
    };
    唯一的遗憾就是对于派生类重写过的虚方法,在模板基类中就没有办法调用到基类相应的虚方法了.毕竟模板基类和别的基类之间不存在继承关系
  • 相关阅读:
    使用C++ 实现的 websocket 客户端 (基于easywsclient)
    ant打包报错 JRE version less than 1.8 is not suppored
    离线安装SVN 4.2.3
    maven项目使用oracle11g
    springboot 新工程报错 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
    IP与域名绑定
    web项目如果省略端口
    Linux源码安装Python3.7服务
    Linux yum软件包安装、管理与使用
    RPM软件包管理与使用
  • 原文地址:https://www.cnblogs.com/fangkm/p/1441156.html
Copyright © 2011-2022 走看看