Documentação
O RELP-CPP é uma biblioteca somente para cabeçalho que fornece recursos de reflexão e introspecção de tempo de compilação para C ++. Ao codificar metadados do tipo no sistema de tipos, o refl-CPP permite processar tipos e seus campos e funções via constexpr e modelo metaprograma.
Usando o refl-CPP em seu projeto? Quero ouvir sobre isso: entre em contato comigo por e-mail (consulte meu perfil), abra um problema ou adicione a tag #refl-cpp aos seus tópicos!
Tem uma pergunta? Tente perguntar no canal Gitter.
Deseja apoiar o refl-CPP? Considere fazer uma doação.
O RELP-CPP visa fornecer um sistema de reflexão genérico flexível o suficiente para atender às suas necessidades, mantendo uma superfície de API relativamente pequena.
Algumas coisas legais de reflex-CPP suporta pronta para uso:
std::tuple s associada a tipos e descritores de membrosproxy<T> com os mesmos membros que T que podem ser usados para embrulhar ou estender a funcionalidadeImplementar um sistema de serialização simples - Exemplo -serialização.cpp - Visualização no Compiler Explorer implementa um procedimento de serialização genérica eficiente do zero
Abstração simples do banco de dados SQL - Exemplo -dao.cpp - Visualização no compilador Explorer implementa um sistema ORM básico que pode gerar instruções SQL em tempo de compilação a partir de classes de modelos usando propriedades personalizadas
Iteate as classes base com bases<> - Exemplo -inferitance.cpp - A visualização no Compiler Explorer usa o atributo bases<> para iterar sobre as classes de base de um tipo
Informações de reflexão de acesso no tempo de execução -Exemplo-custom-rtti.cpp-A exibição no compilador explorador implementa uma abstração básica de tempo de execução sobre o refl-cpp, que fornece acesso aos metadados de reflexão em tempo de execução por meio de objetos de metadados personalizados
GUI baseada em XML com propriedades fortemente de tipo
Implementar uma fábrica de classe de construtores genéricos - Exemplo de compilador.cpp - A visualização no Compiler Explorer define uma classe genérica builder<T> , que implementa o padrão do construtor para qualquer tipo T
Converter campos em métodos de acessórios - Exemplo -proxy.cpp - A visualização no compilador Explorer usa o recurso Proxy para criar um tipo genérico value_proxy<T> que expõe todos os campos de T através dos métodos de acessadores
Veja uma matriz de estruturas como uma estrutura de matrizes -Exemplo de estrutura de areias.cpp-no compiler explorer usa o recurso proxy para criar um tipo genérico struct_of_arrays<T> que armazena todos os membros de T em std::vector , mas também possui um T operator[](int) que constrói os objetos individuais e
Gere uma estrutura de std::optional - Exemplo -parcials.cpp - A visualização no Compiler Explorer usa o recurso proxy para criar um tipo genérico partial<T> que envolve todos os membros de T em std::optional
Comecei a desenvolver o refl-CPP durante meu último ano no ensino médio. Eu deveria estar estudando para os exames, mas acabei de ler a proposta original de reflexão estática (2017) e, depois de perceber que ela não estava chegando tão cedo, decidi que tinha que tentar amontoar o maior número desses recursos possíveis em uma biblioteca de tempo de compilação.
A biblioteca cresceu e mudou muito desde os primeiros dias, mas mesmo depois de vários anos, ainda não vi outra biblioteca de reflexão que suporta a Metaprogramação do ConstexPR e do modelo. Com outras bibliotecas, você geralmente precisa percorrer uma estrutura de metadados em tempo de execução, invocar ponteiros de função e usar o tipo-enerrear. Com o RELL-CPP, você processa os metadados do tipo em tempo de compilação, via for_each loops, todos os tipos estão lá, e o compilador geralmente pode embrulhar tudo e gerar o mesmo código que você teria escrito à mão.
Todas as funções de utilidade no refl-CPP são constexpr (exceto as do refl::runtime ). Os compiladores geralmente embrulham todos os loops e outras construções (ao usar -O2 ) e geram código que funciona tão rápido como se fosse escrito à mão.
Graças a algumas otimizações especiais de tempo de compilação, os metadados do tipo geralmente não são instanciados (nenhum código-geração precisa acontecer) quando os próprios tipos não são usados na reflexão. Com 0,12.2, também houve algumas reduções importantes no tempo de compilação ao usar as propriedades nº 60.
Dito isto, uma palavra de cautela: observei que, depois de 250 membros refletidos marcando, os tempos de compilação começam a crescer rapidamente. Se a sua base de código contiver muitas classes enormes (funções +250) e você precisará que todas elas refletissem com refl-cpp , isso pode ser um disjuntor de acordo - benchmark antes de usar.
Para usar o refl-CPP como uma biblioteca de um único cabeçalho, a cópia include/refl.hpp para o seu diretório de incluir.
Você também pode consumir o refl-CPP como um dependente do CMake (3.14+ necessário, obrigado @friendlyanon).
vcpkg install refl-cpp (obrigado @vennor)conan install refl-cpp A documentação online é construída com doxygen. Execute doxygen Doxyfile em docs/ para atualizá -lo.
Execute cmake com -Drefl-cpp_DEVELOPER_MODE=ON e faça o destino refl-cpp-tests .
Execute cmake com -Drefl-cpp_DEVELOPER_MODE=ON sinalizador. Você também pode configurar uma predefinição personalizada para uma experiência de desenvolvedor mais conveniente (consulte este comentário no #44).