C++函數(shù)注冊技術
-
關鍵字
Lambda、函數(shù)模板、宏、預編譯文件
-
代碼
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) //注冊函數(shù)開始 #define AutoRegisterBegin\ static RunRegisterFunction LINENAME(s_runRegisterFunction, __LINE__)([](){ //注冊函數(shù)結束 #define AutoRegisterEnd\ });\ -
說明
在函數(shù)外,通過創(chuàng)建靜態(tài)類,執(zhí)行構造函數(shù)的方法,構造函數(shù)傳入一個Lambda表達式,用戶實際是在Lambda表達式中完成邏輯部分,為了解決靜態(tài)類名重命名的問題,使用C++的自帶宏
__LINE__ //CPP對應的行號完成靜態(tài)類創(chuàng)建,再在外部用AutoRegisterBegin封好即可。
static的作用域只適用于當前cpp,注意?。?/p>
-
使用場景
工廠模式添加新工廠時,方便在對應cpp后適用Begin和End宏,然后將新增的工廠類添加到工廠生產者類表中,完成工廠類的注冊。
更廣泛一點的說,可以在一個cpp任意的位置,執(zhí)行類的靜態(tài)方法,單例的方法等。