
很早之前整理过模块(C++类)之间函数访问方式,如果不用头文件的方式,如何访问呢?
可以简化认为函数方法是一个地址,只要我们获得了这个地址,就可以访问它。这很符合std::function的用法。
std::function 是 C++11 引入的函数包装器,它可以存储、复制和调用任何可调用对象(callable object)。
std::function 的核心特点:
1>类型擦除:可以存储不同类型的可调用对象
2>运行时多态:在运行时决定调用哪个函数
3>使用统一接口:都通过 operator() 调用
4>可复制、可移动
以上是std::function相关的知识点。
2、不用头文件调用方法的简要示例
class Base{public: Base(){} ~Base(){} };templateclass Functions :public Base {public: typedef typename std::functionFunc; Func func; RetT return_;public: Functions(Func f1) :Base(), func(f1) { typedef typename std::remove_reference::type RetT_; } ~Functions(){} };class ShareFunctions{public: ShareFunctions(){} ~ShareFunctions(){} template <typename </typenameRetT> void AddFunction(std::string func_name, std::functionfunc) { map_functions.emplace(std::map <std::string, </std::string,Base*>::value_type(func_name, new Functions(func))); return; } template <typename </typenameRetT> std::function GetFunction(std::string func_name) { std::map <std::string, </std::string,Base*>::iterator itr = map_functions.find(func_name); if (itr != map_functions.end()) { return ((Functions*)(itr->second))->func; } return nullptr; }private: std::map <std::string, </std::string,Base*> map_functions;};class Funcmanager{public: Funcmanager(std::map <std::string, </std::string,ShareFunctions*> *functions) { share_func_group = functions; } ~Funcmanager(){} bool CreateFuncGroup(std::string scope_name) { std::map <std::string, </std::string,ShareFunctions*>::iterator itr = share_func_group->find(scope_name); if (itr != share_func_group->end()) { return false; } share_func_group->insert(std::map <std::string, </std::string,ShareFunctions*>::value_type(scope_name, new ShareFunctions())); return true; } ShareFunctions* GetFuncGroup(std::string scope_name) { std::map <std::string, </std::string,ShareFunctions*>::iterator itr = share_func_group->find(scope_name); if (itr != share_func_group->end()) { return itr->second; } return nullptr; }private: std::map <std::string, </std::string,ShareFunctions*> *share_func_group;};int Print(std::string& str){ std::cout << "--------------->>>>> " << str << std::endl; return 0;}int main(void){ std::cout << "emter main " << std::endl; std::map <std::string, </std::string,ShareFunctions*> share_func_group; Funcmanager *funcmanager = new Funcmanager(&share_func_group); funcmanager->CreateFuncGroup("TestModule"); ShareFunctions *func_handle = funcmanager->GetFuncGroup("TestModule"); func_handle->AddFunction <int, </int,std::string&>("Test1", std::bind(&Print, std::placeholders::_1)); /////////////////////////////////////////// std::function test1; ShareFunctions *func_handle_get = funcmanager->GetFuncGroup("TestModule"); if (nullptr != func_handle_get) { std::cout << "--------------->>>>> func_handle_get not null" << std::endl; } test1 = func_handle_get->GetFunction("Test1"); std::string sss("6666"); test1(sss); return 0;}
以上是一个简小的例子。各位有兴趣可以研究下如何用C语言来实现?
写这个是我在工作中确实遇到了相关问题。面对一个维护了10来年且出货量较大的工业产品、定制化非标产品较多、全局变量甚多、兼容之前的数据结构、数据结构采用表格维护等情况。世界是个蛮神奇的系统,在激烈的市场竞争下,活下来的软件系统才能有机会被重构,即使原来的系统非常ugly。
欢迎关注:

被折叠的 条评论
为什么被折叠?



