Pergunta

Existe uma maneira para enumerar os membros de uma estrutura (struct | classe) em C ++ ou C? Eu preciso para obter o nome do membro, tipo e valor. Eu usei o código de exemplo a seguir antes em um projeto pequeno, onde as variáveis ??foram escopo global. O problema que tenho agora é que um conjunto de valores precisam ser copiados do GUI a um objeto, arquivo e ambiente VM. Eu poderia criar sistema de reflexão outro "pobre homem" ou espero que algo melhor que eu não tenha pensado ainda. Alguém tem alguma ideia?

EDIT:. Eu sei C ++ não tem reflexo

union variant_t {
   unsigned int  ui;
   int           i;
   double        d;
   char*         s;
};

struct pub_values_t {
   const char*      name;
   union variant_t* addr;
   char             type;  // 'I' is int; 'U' is unsigned int; 'D' is double; 'S' is string
};

#define pub_v(n,t) #n,(union variant_t*)&n,t
struct pub_values_t pub_values[] = {
   pub_v(somemember,  'D'),
   pub_v(somemember2, 'D'),
   pub_v(somemember3, 'U'),
   ...
};

const int no_of_pub_vs = sizeof(pub_values) / sizeof(struct pub_values_t);
Foi útil?

Solução

Para dizer o óbvio, não há nenhuma reflexão em C ou C ++. Daí nenhuma maneira confiável de enumerar variáveis ??de membro (por padrão).

Se você tem controle sobre sua estrutura de dados, você pode tentar um std::vector<boost::any> ou um std::map<std::string, boost::any> em seguida, adicionar todas as suas variáveis ??de membro para o vector / mapa.

Claro, isso significa todas as suas variáveis ??provavelmente será na pilha de modo que haverá um acerto de desempenho com esta abordagem. Com a aproximação std :: mapa, isso significa que você teria um tipo de reflexão "pobre homem".

Outras dicas

Você pode especificar seus tipos em um arquivo intermediário e gerar o código C ++ disso, algo como classes COM podem ser gerados a partir de arquivos IDL. O código gerado fornece capacidades de reflexão para esses tipos.

Eu fiz algo semelhante duas maneiras diferentes para diferentes projetos:

  • um arquivo personalizado analisado por um script Ruby para fazer a geração
  • definem os tipos como C tipos #, uso C # 's reflexão para obter todas as informações e gerar C ++ a partir desta (sons complicado, mas funciona surpreendentemente bem, e escrever as definições de tipo é bastante semelhante ao escrever definições C ++)

Impulso tem um pronto para usar Variant biblioteca que podem atender às suas necessidades.

forma mais simples - mudar para Objective-C ou Objective-C ++. Que as línguas têm uma boa introspecção e são full-compatível com fontes de C / C ++.

Além disso, você pode usar m4 / cog / ... para a estrutura geração simultânea e sua descrição de alguns meta-descrição.

Parece que você está construindo algum tipo de depurador. Eu acho que isso deve ser factível se você certifique-se de gerar arquivos pdb ao construir o seu executável.

Não tenho certeza em que contexto você quer fazer essa enumeração, mas em seu programa que você deve ser capaz de chamar funções de Microsofts dbghelp.dll para obter informações sobre o tipo de variáveis ??etc. (eu sou supondo que você está usando o Windows, o que pode, naturalmente, não ser o caso)

Espero que isso ajude a levá-lo um pouco mais.

Felicidades!

Uma vez que C ++ não tem reflexo embutido, você só pode obter a informação estar ensinando separadamente seu programa sobre o conteúdo struct.

Isso pode ser através da geração de sua estrutura a partir de um formato que você pode usar depois que para conhecer a informação strcture, ou ao analisar o seu arquivo .h para extrair as informações de estrutura.

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