现在希望实现一个需求,就是用户可以直接在配置文件中调整调用函数的顺序,我的程序能立刻根据配置文件中的定义来执行对应的操作顺序。
举例:
C++文件:
void f1(){cout<<"f1";} void f2(){cout<<"f2";} void f3(){cout<<"f3";}
配置文件:
<event event_="Add"> <handle>f3</handle> <handle>f2</handle> <handle>f1</handle> </event>
那么执行程序,当 Add 事件被触发就会依次输出 f3 f2 f1。
这种需求有什么好的方法实现吗?
我能想到的方法是,构建一个 map<string,function<void(void)>> 对象,但是这种方法会使得注册函数比较容易遗漏。
1 whileFalse 2019-09-02 12:20:37 +08:00 不会啊。你只需要: 以任何方式使用这一系列函数时,都只通过你这个“注册中心”调用,绝对不直接调用函数名。 这样如果你写了一个函数但没有把它放到注册中心里,就跟没写一样,所以你肯定会发现的。 |
2 nifury 2019-09-02 12:21:06 +08:00 做成导出函数? 不过一样会有遗漏的问题 原生函数不加修饰的话函数名信息肯定没有了 加的话就会有遗漏的问题 感觉无解 |
3 joshu 2019-09-02 12:24:04 +08:00 via Android ![]() 我觉得就只有这种方法吧。。。如果函数签名不一样就用函数指针吧,写个宏封装参数形态和名称注册 |
![]() | 4 AlohaV2 2019-09-02 12:40:28 +08:00 via iPhone 保证接口一致,然后用静态的 map 注册好函数名到函数的对应,比如是 string 到 std function<void()>. |
5 GeruzoniAnsasu 2019-09-02 12:52:37 +08:00 via Android 不清楚具体需求 但给个思路:不考虑移植性的话,函数名可以通过 dladdr 查到,再通过 abi::__cxa_demangle 转成可读的签名 |
6 GeruzoniAnsasu 2019-09-02 12:57:00 +08:00 |
7 ai277014717 2019-09-02 12:58:13 +08:00 commit 加个钩子检查一下配置文件和类的关系 |
![]() | 8 Yang2096 2019-09-02 13:00:04 +08:00 via Android 有点责任链模式的感觉,不知道行不行 |
![]() | 9 x1314aq 2019-09-02 13:05:40 +08:00 via iPhone 直接通过 dlsym()就可以拿到函数地址,不需要其他别的任何操作。 |
10 skywolf1219 2019-09-02 13:09:32 +08:00 推荐一个 c++的反射库 https://www.rttr.org/ |
![]() | 11 ChristopherWu 2019-09-02 13:26:38 +08:00 |
![]() | 13 x1314aq 2019-09-03 17:35:31 +08:00 via iPhone |