10_软件设计补漏_不用头文件如何访问函数

很早之前整理过模块(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。

欢迎关注:

9_异步编程的转变_执行器_1

8_线程的实时调度_调度策略和优先级

7_线程安全_线程间的内存可视性2缓存_内存屏障_读写排序

6_线程安全_线程间的内存可视性_1

架构设计专题——多线程数据安全

5_软件重构_模块间通讯方式_事件

4_软件重构_二进制兼容接口设计

3_软件重构_组件化开发实例方法论

2_软件重构_一种组件化开发方式

1_C++进程内模块之间调用函数的方式

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值