Otro marco de plugin de C ++

Entrada


Quien no visitó, usando bibliotecas de código abierto, pensó: "¡Gracias a estos muchachos por esta genial lib! ¡Algún día escribiré algo que valga la pena y lo pondré en público para que otros puedan usarlo! "


Si todos! O no? ..


Con el advenimiento del estándar C ++ 17, nuestra se resuelve de manera mucho más rápida y elegante, solo debe querer realizar su idea y poder poner en práctica los beneficios con los que los chicos de WG21 nos miman .
? : #, )) ...


Antecedentes


El tema de los complementos es bastante interesante, ya que le permite crear una nueva funcionalidad en el Software (software) sin realizar cambios en el núcleo del programa, pero al mismo tiempo, debe pensarse y escribirse una interfaz para la interacción: Software <-> Plugins Manager <-> Complementos .


Tengo experiencia (sin éxito) en entrevistar a una empresa que tiene su propio sistema de plug-in para sistemas integrados, debido a la complejidad de la arquitectura en la que fallé la tarea de prueba. Hay muchas macros dentro de las clases base de las cuales se hereda, y muchas cosas que hacen que la vida cotidiana del programador sea gris al momento de usar tales soluciones ...


En uno de los momentos de autoeducación y lectura de artículos sobre C ++ 17, se decidió consolidar el conocimiento adquirido al escribir un sistema de complemento que sería comprensible y fácil de usar.


Qué mal o qué bien lo hice, juzgad, queridos Khabrovites ...


Revisar


Características de la biblioteca


  • Complementos como servicios (se ejecutan en operaciones separadas)
  • Descargar automáticamente complementos no utilizados

Pros


  • Facilidad de uso
  • Ejecución asincrónica de tareas
  • Diseño de solo encabezado

Contras


  • Si se introduce un nuevo complemento en el sistema, debe compilarse con la misma versión del compilador que el administrador que lo descarga (así como libstdc ++) para la compatibilidad ABI
  • Cachés constantes de std :: any a los tipos utilizados?
  • Validación de futuros?

Creación de complementos


 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); }, "  " ); } }; 

Descargar plugin


 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; } 

Vea ejemplos más detallados en la página del proyecto.


En lugar de una conclusión


Me complace mucho leer artículos informativos sobre Habra en C ++ (y no solo en C ++),
Espero que encuentre este artículo interesante y al menos algo informativo.


En mi humilde opinión, puede usar lib en prod, dejar que echen un vistazo a los C ++ más autorizados y decir su palabra, el código fuente está bien documentado y no hay muchos de ellos, alrededor de 1000 líneas.


Enlace al proyecto


microplugins

Source: https://habr.com/ru/post/es422401/


All Articles