当前位置: 首页 > news >正文

使用c++14标准实现函数注册包装

调用方式bool res = FunctionRegistry::callFromFuncMap1<bool, type1&, type2*, type3,... >(...),其中第一个bool为返回值类型,第二个开始后面均为参数列表类型,可用于注册算子,包装函数指针等。

#include <functional>
#include <map>
#include <memory>
#include <mutex>
#include <string>
#include <unordered_map>
#include <vector>namespace op_select {#define ORAM_BASE 0x15100000class FunctionWrapperBase {
public:virtual ~FunctionWrapperBase() = default;
};template <typename ReturnType, typename... Args>
class FunctionWrapper : public FunctionWrapperBase {
private:std::function<ReturnType(Args...)> func_;public:FunctionWrapper(std::function<ReturnType(Args...)> func) : func_(func) {}ReturnType operator()(Args... args) {return func_(args...);}
};class FunctionRegistry {
private:static std::unordered_map<std::string, std::shared_ptr<FunctionWrapperBase>>& getFuncMap1() {static std::unordered_map<std::string, std::shared_ptr<FunctionWrapperBase>> func_map1;return func_map1;}static std::unordered_map<std::string, std::shared_ptr<FunctionWrapperBase>>& getFuncMap2() {static std::unordered_map<std::string, std::shared_ptr<FunctionWrapperBase>> func_map2;return func_map2;}static std::mutex& getMutex1() {static std::mutex mutex1;return mutex1;}static std::mutex& getMutex2() {static std::mutex mutex2;return mutex2;}public:FunctionRegistry() = delete;FunctionRegistry(const FunctionRegistry&) = delete;FunctionRegistry& operator=(const FunctionRegistry&) = delete;template <typename ReturnType, typename... Args>static bool registerToFuncMap1(const std::string& name, ReturnType (*func)(Args...)) {std::lock_guard<std::mutex> lock(getMutex1());std::function<ReturnType(Args...)> f = func;auto wrapper = std::make_shared<FunctionWrapper<ReturnType, Args...>>(f);return getFuncMap1().emplace(name, wrapper).second;}template <typename ReturnType, typename... Args>static bool registerToFuncMap1(const std::string& name, std::function<ReturnType(Args...)> func) {std::lock_guard<std::mutex> lock(getMutex1());auto wrapper = std::make_shared<FunctionWrapper<ReturnType, Args...>>(func);bool res = getFuncMap1().emplace(name, wrapper).second;return getFuncMap1().emplace(name, wrapper).second;}template <typename ReturnType, typename... Args>static bool registerToFuncMap2(const std::string& name, ReturnType (*func)(Args...)) {std::lock_guard<std::mutex> lock(getMutex2());std::function<ReturnType(Args...)> f = func;auto wrapper = std::make_shared<FunctionWrapper<ReturnType, Args...>>(f);return getFuncMap2().emplace(name, wrapper).second;}template <typename ReturnType, typename... Args>static bool registerToFuncMap2(const std::string& name, std::function<ReturnType(Args...)> func) {std::lock_guard<std::mutex> lock(getMutex2());auto wrapper = std::make_shared<FunctionWrapper<ReturnType, Args...>>(func);return getFuncMap2().emplace(name, wrapper).second;}template <typename ReturnType, typename... Args>static ReturnType callFromFuncMap1(const std::string& name, Args&&... args) {std::lock_guard<std::mutex> lock(getMutex1());auto it = getFuncMap1().find(name);if (it == getFuncMap1().end()) {throw std::runtime_error("Function '" + name + "' not found in FuncMap1");}auto wrapper = std::dynamic_pointer_cast<FunctionWrapper<ReturnType, Args...>>(it->second);if (!wrapper) {throw std::runtime_error("Type mismatch for function '" + name + "' in FuncMap1");}return (*wrapper)(std::forward<Args>(args)...);}template <typename ReturnType, typename... Args>static ReturnType callFromFuncMap2(const std::string& name, Args&&... args) {std::lock_guard<std::mutex> lock(getMutex2());auto it = getFuncMap2().find(name);if (it == getFuncMap2().end()) {throw std::runtime_error("Function '" + name + "' not found in FuncMap2");}auto wrapper = std::dynamic_pointer_cast<FunctionWrapper<ReturnType, Args...>>(it->second);if (!wrapper) {throw std::runtime_error("Type mismatch for function '" + name + "' in FuncMap2");}return (*wrapper)(std::forward<Args>(args)...);}
};#define REGISTER_FUNCTION_TO_FUNC_MAP1(name, func)                                                                     \static bool _reg##name = [] {                                                                                      \FunctionRegistry::registerToFuncMap1(#name, func);                                                             \return true;                                                                                                   \}()#define REGISTER_FUNCTION_TO_FUNC_MAP1(name, func)                                                                     \static bool _reg##name = [] {                                                                                      \FunctionRegistry::registerToFuncMap2(#name, func);                                                             \return true;                                                                                                   \}()#define REGISTER_FUNCTION_TO_BOTH(name, func1, func2)                                                                  \static bool _reg##name = [] {                                                                                      \FunctionRegistry::registerToFuncMap1(#name, func1);                                                            \FunctionRegistry::registerToFuncMap2(#name, func2);                                                            \return true;                                                                                                   \}()#define REGISTER_LAMBDA_TO_FUNC_MAP1(name, return_type, ...)                                                           \static bool _reg##name = [] {                                                                                      \FunctionRegistry::registerToFuncMap1<return_type, __VA_ARGS__>(name, std::function<return_type(__VA_ARGS__)>); \return true;                                                                                                   \}()#define REGISTER_LAMBDA_TO_FUNC_MAP2(name, return_type, ...)                                                           \static bool _reg##name = [] {                                                                                      \FunctionRegistry::registerToFuncMap2<return_type, __VA_ARGS__>(name, std::function<return_type(__VA_ARGS__)>); \return true;                                                                                                   \}()}  // namespace op_select
http://www.gsyq.cn/news/25592.html

相关文章:

  • 【VSCode中Java创建环境安装的三个层级之Maven篇】(Windows版)
  • 2025年不锈钢酸洗钝化液厂家推荐排行榜,环保型不锈钢管酸洗钝化液,不锈钢清洗钝化液,酸洗钝化处理工艺及不锈钢清洗剂公司推荐
  • 2025年法兰保护罩厂家推荐排行榜,阀门保温罩,法兰罩,法兰防溅罩,法兰保护套,专业防护与定制服务优质供应商
  • 百度网盘非会员下载慢怎么解决 - fosgrignonhto
  • d435i 标定 imu和相机 用来复现vins_fusion - 教程
  • K230基础-摄像头的使用 - 详解
  • 2025年市面上高杆灯品牌Top10权威推荐榜单
  • Spring AOP 原理
  • 250921
  • Jvm参数分类
  • 10/20
  • 2025年市面上工程石材产品排名前十:选购指南与品牌深度解析
  • 2025年市面上工程石材产品排名前十:权威榜单与选择指南
  • 听说今年很多应届硕士很难找到工作...
  • 开源 C++ QT QML 创建(四)复杂控件--Listview
  • 意大利居留 办理 看小红书上的材料就行,部分材料可以到按手印再补交
  • 博客的意義
  • 我写过的动态规划问题的状态表示与转移汇总
  • 热点、排版、数据难题?6 款微信编辑器实测推荐
  • AI建的网站,真的对SEO友好吗?深度剖析其优势与潜在缺陷
  • 2025年上海律师推荐排行榜,经侦律师,民事纠纷律师,刑事律师,经济律师,婚姻律师,法务律师,负债律师事务所专业解析
  • 2025年棋牌室加盟品牌权威推荐榜:自主棋牌室加盟,自助棋牌室加盟,智能棋牌室加盟,共享棋牌室加盟品牌综合评测与选址运营指南
  • 2025年焊接变位机厂家权威推荐榜:变位机/双轴变位机专业制造,高精度传动与定制化解决方案实力解析
  • 20232426 2025-2026-1 《网络与系统攻防技术》实验二实验报告
  • 题单
  • 2025年防腐工程厂家最新权威推荐榜:喷砂/热喷锌/热喷铝/油漆涂装/热喷耐磨材料,专业工艺与长效防护解决方案
  • Wamp 启动图标橙色(2/3 服务运行):MySQL 服务启动失败解决方案
  • 2025年超声波检测设备厂家权威推荐榜:超声波检测系统,相控阵/高频/水浸/液冷板/钎焊超声波检测,专业设备与技术实力深度解析
  • 在VSCode中配置C/C++环境(使用gdb和code-runner两种方式配置)
  • 【MySQL】MVCC:从核心原理到幻读解决方案 - 实践