另一个C ++插件框架

参赛作品


谁没有访问使用开放源代码库的想法: “感谢这些人提供的这个很棒的库! 总有一天,我会写点有价值的东西,并公开发布,以便其他人可以使用!”


是的,大家! 还是不?


随着C ++ 17标准的问世,我们的得到了更快,更优雅的解决,您只需要实现您的想法,并能够将WG21员工沉迷于我们的好东西付诸实践。
? : #, )) ...


背景知识


插件的主题非常有趣,因为它允许您在不更改程序核心的情况下在软件(软件)中创建新功能,但是与此同时,应考虑并编写一个交互界面: Software <-> Plugins Manager <-> Plugins


由于没有完成测试任务的体系结构的复杂性,我在采访一家拥有自己的嵌入式系统插件系统的公司时有经验(未成功)。 从中继承基类的内部有很多宏,在使用此类解决方案时,很多事情会使程序员的日常生活变得灰暗...


在自我教育和阅读有关C ++ 17的文章时,决定在编写易于理解和易于使用的插件系统时巩固所获得的知识。


我做得有多好坏-亲爱的哈布罗维特,请审判你...


复习


图书馆特色


  • 插件即服务(在单独的行业中运行)
  • 自动卸载未使用的插件

优点


  • 易用性
  • 异步任务执行
  • 仅标头设计

缺点


  • 如果将新插件引入系统,则必须使用与下载该插件的管理员(以及libstdc ++)相同的编译器版本进行编译,以实现ABI兼容性
  • 从std ::任何类型使用的常量缓存?
  • 验证期货?

插件创建


 class myplugin : public micro::iplugin { public: myplugin(int ver, const std::string& nm):micro::iplugin(ver, nm) { //     subscribe<2>("sum2", [](std::any a, std::any b)-> std::any { return std::any_cast<int>(a) + std::any_cast<int>(b); }, "  " ); } }; 

下载插件


 std::shared_ptr<micro::plugins> manager = micro::plugins::get(); std::shared_ptr<micro::iplugin> myplugin = manager->get_plugin("myplugin"); if (myplugin && myplugin->has<2>("sum2")) { std::shared_future<std::any> result = myplugin->run<2>("sum2", 25, 25); result.wait(); std::cout << std::any_cast<int>(result.get()) << std::endl; } 

在项目页面上查看更多详细的示例


而不是结论


我非常高兴阅读有关C ++(不仅限于C ++)上有关Habra的文章,
我希望您会发现这篇文章有趣并且至少可以提供一些信息。


以我的拙见,您可以在prod中使用lib,让他们看一看更权威的C ++并说出自己的话,它们的文献记录很好,而且来源不多-大约1000行。


链接到项目


微插件

Source: https://habr.com/ru/post/zh-CN422401/


All Articles