Outra estrutura de plug-in C ++

Entrada


Quem não visitou, usando bibliotecas de código-fonte aberto, o pensamento: "Obrigado a esses caras por esta interessante lib! Um dia vou escrever algo que valha a pena e publicá-lo para que outros possam usá-lo! "


Sim pessoal! Ou não?


Com o advento do padrão C ++ 17, nossa lista de é resolvida com muito mais rapidez e elegância, você só precisa realizar sua ideia e poder colocar em prática os itens com os quais os caras do WG21 nos mimam.
? : #, )) ...


Antecedentes


O tópico dos plug-ins é bastante interessante, pois permite que você faça novas funcionalidades no Software (software) sem fazer alterações no núcleo do programa, mas ao mesmo tempo, uma interface de interação deve ser pensada e escrita: Software <-> Plugins Manager <-> Plugins .


Tenho experiência (sem êxito) em entrevistar uma empresa que possui seu próprio sistema de plug-in para sistemas embarcados, devido à complexidade da arquitetura da qual falhei na tarefa de teste. Existem muitas macros nas classes base das quais é herdada e muitas coisas que tornam a vida cotidiana do programador obscurecida na hora de usar essas soluções ...


Em um dos momentos de auto-educação e leitura de artigos sobre C ++ 17, foi decidido consolidar o conhecimento adquirido ao escrever um sistema de plug-in que seria compreensível e fácil de usar.


Quão ruim ou bom eu fiz isso - julgue você, queridos Khabrovites ...


Revisão


Recursos da biblioteca


  • Plugins como serviços (executados em transações separadas)
  • Descarregar automaticamente plugins não utilizados

Prós


  • Facilidade de uso
  • Execução de tarefa assíncrona
  • Design apenas de cabeçalho

Contras


  • Se um novo plug-in for introduzido no sistema, ele deverá ser compilado com a mesma versão do compilador que o gerenciador que o baixou (assim como o libstdc ++) para compatibilidade com ABI
  • Caches constantes de std :: any para os tipos usados?
  • Validação de futuros?

Criação de plugins


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

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

Veja exemplos mais detalhados na página do projeto.


Em vez de uma conclusão


Estou muito satisfeito por ler artigos informativos sobre o Habra no C ++ (e não apenas no C ++),
Espero que você ache este artigo interessante e pelo menos um pouco informativo.


Na minha humilde opinião, você pode usar lib in prod, deixe-os dar uma olhada em C ++ mais autoritativos e dizer a palavra, as fontes estão bem documentadas e não existem muitas - cerca de 1000 linhas.


Link para o projeto


microplugins

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


All Articles