• 代码小技巧


    先上一段代码:
    class  CTagBase
    {
    public:
        
    virtual ~CTagBase()
        {}

        
    virtual  void  Init()  =  0;
    };

    #define  MakeDeriveClass( XDerive )        \
                
    class  XDerive : public CTagBase        \
                {        \
                
    public:        \
                    
    virtual  void  Init()        \
                    {  AtlMessageBox( NULL, __FUNCTION__  ); }  \
                };

    MakeDeriveClass( CMacroDeriveFromBase1 )
    MakeDeriveClass( CMacroDeriveFromBase2 )
    MakeDeriveClass( CMacroDeriveFromBase3 )

    CMacroDeriveFromBase1  macroDerive1;
    CMacroDeriveFromBase2  macroDerive2;
    CMacroDeriveFromBase3  macroDerive3;

    macroDerive1.Init();
    macroDerive2.Init();
    macroDerive3.Init();
    此代码利用宏创建了CMacroDeriveFromBase1CMacroDeriveFromBase2CMacroDeriveFromBase3三个类,这3个类的结构是一样的。从某种意义上说,此时宏方便了我们编码,但是调试时的确不直观了.下面用模板的tag手法重构一下:
    template<typename>
    class  CTagDerive : public CTagBase
    {
    public:
        
    virtual  void  Init()
        { AtlMessageBox( NULL, __FUNCTION__  ); }
    };

    struct  STagDeriveFromBase1_Tag 
    {};
    typedef  CTagDerive
    <STagDeriveFromBase1_Tag>  CTagDeriveFromBase1;

    struct  STagDeriveFromBase2_Tag 
    {};
    typedef  CTagDerive
    <STagDeriveFromBase1_Tag>  CTagDeriveFromBase2;

    struct  STagDeriveFromBase3_Tag 
    {};
    typedef  CTagDerive
    <STagDeriveFromBase1_Tag>  CTagDeriveFromBase3;



    CTagDeriveFromBase1  tagDerive1;
    CTagDeriveFromBase2  tagDerive2;
    CTagDeriveFromBase3  tagDerive3;

    tagDerive1.Init();
    tagDerive2.Init();
    tagDerive3.Init();
    tag手法可以看作trait手法的一种简化,目的在于产生不同的类型.
  • 相关阅读:
    Redis安装与配置
    Mysql主从复制
    MySQL的基本使用
    如何理解 python 里面的 for 循环
    我在创业公司的 “云原生” 之旅
    linux 安装 kafka
    数据库性能优化
    Shell 中各种括号的作用
    DNS 配置实例-正反解析-主从同步-分离解析
    DHCP 中继转发配置(ensp 实现)
  • 原文地址:https://www.cnblogs.com/fangkm/p/1543487.html
Copyright © 2020-2023  润新知