C++函数注册技术

C++函数注册技术


  • 关键字

    Lambda、函数模板、宏、预编译文件

  • 代码

    class RunRegisterFunction
    {
    public:
        template RunRegisterFunction(const T& f){f();}
    };
    //名字合并
    #define NAMECAT(name1, name2) name1##name2
    //以cpp对应的行号
    #define LINENAME(name1, name2) NAMECAT(name1, name2)
    //注册函数开始
    #define AutoRegisterBegin\
            static RunRegisterFunction LINENAME(s_runRegisterFunction, __LINE__)([](){
    //注册函数结束
    #define AutoRegisterEnd\
            });\
    
  • 说明

    在函数外,通过创建静态类,执行构造函数的方法,构造函数传入一个Lambda表达式,用户实际是在Lambda表达式中完成逻辑部分,为了解决静态类名重命名的问题,使用C++的自带宏

    __LINE__   //CPP对应的行号
    

    完成静态类创建,再在外部用AutoRegisterBegin封好即可。

    static的作用域只适用于当前cpp,注意!!

  • 使用场景

    工厂模式添加新工厂时,方便在对应cpp后适用Begin和End宏,然后将新增的工厂类添加到工厂生产者类表中,完成工厂类的注册。

    更广泛一点的说,可以在一个cpp任意的位置,执行类的静态方法,单例的方法等。

你可能感兴趣的:(C++函数注册技术)