Pergunta

projetos mais maduros C ++ parecem ter uma própria reflexão e atributo de sistema , ou seja para a definição de atributos que podem ser acessados ??por cordas e são automaticamente serializado. Em muitos projectos menos C ++ Eu participei na parecia reinventar a roda .

Você conhece algum boas bibliotecas open source para C ++ recipientes que suporte reflexão e de atributos, especificamente:

  • Definir RTTI e atributos através de macros
  • Acessando RTTI e atributos por meio de código
  • serialização automática de atributos
  • escuta a modificações de atributos (por exemplo OnValueChanged)
Foi útil?

Solução

Você poderia ter um olhar para as duas ferramentas abaixo. Eu nunca usei qualquer um deles, então eu não posso te dizer como (im) eles são práticos.

XRTTI :

Xrtti é uma ferramenta e que acompanha biblioteca C ++ que se estende o sistema do tipo de execução padrão de C ++ para fornecer um conjunto muito mais rica de informação reflexão sobre classes e métodos para manipular estas classes e seus membros.

OPENÇ ++ :

OPENÇ ++ é uma biblioteca frontend C ++ (lexer + analisador + DOM / MOP) e tradutor fonte-to-source. OPENÇ ++ permite o desenvolvimento de C ++ ferramentas de linguagem, extensões compilador otimizações específicas de domínio e protocolos de execução metaobjeto.

Outras dicas

Isto é o que você começa quando C ++ atende Reflexão:

C ++ atende Reflection

O que quer que você escolher, ele provavelmente vai ter macros horríveis, difícil de código de depuração ou etapas de construção estranhas. Eu vi um sistema de gerar automaticamente o código de serialização de arquivo PDB do DevStudio.

Falando sério, para pequenos projetos, vai ser mais fácil de escrever salvar / carregar funções (ou o uso de streaming operadores). Na verdade, que espera poder para grandes projetos também - é óbvio o que está acontecendo e você normalmente precisaria de código de mudança de qualquer maneira se as mudanças na estrutura

.

Há um novo projeto fornecendo reflexo em C ++ usando uma abordagem totalmente diferente: CAMP . https://github.com/tegesoft/camp

CAMP não usa um pré-compilador, as classes / propriedades / funções / ... são declarados manualmente usando uma sintaxe semelhante ao boost.python ou luabind. Claro, as pessoas podem usar um pré-compilador como gccxml ou-c aberta ++ para gerar esta declaração se eles preferem.

É baseado em puro C ++ e impulsionar apenas cabeçalhos, e graças ao poder do modelo de meta-programação que suporta qualquer tipo de entidade bindable (herança e estranhos construtores não são um problema, por exemplo).

Ele é distribuído sob a licença MIT (anteriormente LGPL).

Eu olhei para essas coisas por um bom tempo, mas eles tendem a ser muito pesada. Eles podem impedi-lo de usar a herança, ou ter construtores estranhos etc etc. No final, eles acabaram sendo demasiado de um fardo, em vez de uma conveniência.

Esta abordagem para expor os membros que agora eu uso é bastante leve e permite explorar uma classe para a serialização ou definir todos os campos chamados "x" para 0, por exemplo. É também estaticamente determinada de modo é muito, muito rápido. Não há camadas de código da biblioteca ou código-gen se preocupar em estragar com o processo de construção. Ele generaliza a hierarquias de tipos aninhados.

Defina o seu editor-se com alguns macros para automatizar escrever algumas dessas coisas.

struct point
{
     int x;
     int y;

     // add this to your classes
     template <typename Visitor>
     void visit(Visitor v)
     {
         v->visit(x, "x"); 
         v->visit(y, "y");
     }
};


/** Outputs any type to standard output in key=value format */
struct stdout_visitor
{
     template <typename T>
     void visit(const T& rhs)
     {
         rhs.visit(this);
     }

     template <typename Scalar>
     void visit (const Scalar& s, const char* name)
     {
          std::cout << name << " = " << s << " ";
     }
}

Olhou para isso por um tempo também. A solução mais fácil atual parece ser BOOST_FUSION_ADAPT_STRUCT . Praticamente uma vez que você tem uma biblioteca / cabeçalho você só precisa adicionar os seus campos de struct no macro BOOST_FUSION_ADAPT_STRUCT (), como o último segmento do código mostra . Sim, tem restrições muitas outras pessoas mencionadas. E ele não suporta ouvintes diretamente.

As outras soluções promissoras, olhei em são

  • CAMP e XRTTI / gccxml, no entanto ambos parecem ser um obstáculo para trazer ferramentas externas dependência em seu projeto.
  • Anos atrás eu usei perl c2ph / pstruct para despejar as informações meta da saída do gcc -gstabs, que é menos intrusivo, mas precisa de mais trabalho embora funcionou perfeitamente para mim.

Em relação à __ abordagem boost / CXA, uma vez que você descobrir todos os pequenos detalhes, Adicionar / mudar estruturas ou campos é simples de manter. no momento a usamos para construir uma tipos personalizados camada de ligação no topo do dbus, para serializar o API e esconder os detalhes de transporte / RPC para um subsistema objeto gerenciado.

Nem um geral, mas QT suporta isso através de uma meta compilador, e é GPL. O meu entendimento de falar com as pessoas QT foi que isso não é possível com puro C ++, daí a necessidade do moc.

Esta é uma fraqueza notória da linguagem C ++ em geral, porque as coisas que precisam ser padronizadas para fazer reflexão implementações portáteis e de valor não são padrão. convenções de chamada, layouts de objetos e símbolo mangling vêm à mente, mas existem outros também.

A falta de direção dos meios padrão que os implementadores do compilador vai fazer algumas coisas de forma diferente, o que significa que muito poucas pessoas têm a motivação para escrever uma biblioteca portátil reflexão, o que significa que as pessoas que necessitam de reflexão re-inventar a roda, mas apenas o suficiente para o que eles precisam. Isso acontece ad infinitum , e aqui estamos nós.

introspecção automática / reflexão toolkit. Use compilador meta como Qt de e adicionando informações meta diretamente em arquivos de objeto. Intuitiva e fácil de usar. Sem dependências externas. Mesmo permitirá automaticamente reflete std :: string e, em seguida, usá-lo em scripts. Por favor, visite IDK

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top