C++函数注册技术
-
关键字
Lambda、函数模板、宏、预编译文件
-
代码
class RunRegisterFunction { public: template<typename T> 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任意的位置,执行类的静态方法,单例的方法等。











网友评论