Existe uma maneira eficiente de adaptar dados de uma estrutura para outra em c ++?

5

Estou escrevendo uma interface entre dois modelos de configuração que usam estruturas diferentes. Embora eu saiba que não existe uma maneira "mágica" de fazer a tradução de um tipo de estrutura para outro, eu vaguei se poderia haver algumas práticas recomendadas ou uma maneira eficiente / eficiente de configurar um sistema desse tipo. Eu acho que é semelhante a como os programas podem gerenciar diferentes estruturas de configuração através de versões.

Aqui está um exemplo simples: digamos que temos uma estrutura do tipo A que contém 3 parâmetros:

struct A {
  int alpha;
  bool beta;
  bool charlie;
};

A segunda estrutura de configuração compartilha os mesmos parâmetros, mas em uma ordem diferente, vamos ver a estrutura B:

struct B {
  union {
    struct {
      char beta : 1;
      char charlie : 1;
    } bit;
    char field;
  }
  int alpha;
};

Um programa simples para converter um A para um B seria:

void convert(A const *aelem, B *belem) {
      belem->alpha = aelem->alpha;
      belem->bit.beta = aelem->beta;
      belem->bit.charlie = aelem->charlie;
    }

Então, embora isso possa parecer bastante simples com essas estruturas básicas, estou lidando com dezenas de estruturas, cada uma contendo cerca de 50 parâmetros. Então, alguém sabe de um bom padrão a seguir para tal problema?

    
por Alex Garcia 31.01.2012 / 17:21
fonte

3 respostas

5

Algumas das pesquisas posteriores sobre otimização de Chamada de Procedimento Remoto envolveram problemas como este. O único que eu posso lembrar e encontrar é Flux RPC. Aquelas pessoas escreveram um artigo sobre a otimização do RPC em 1995 que pode ter algum interesse para você. Se bem me lembro (eu não relei o artigo), eles tinham algum código de serialização / empacotamento que fazia praticamente o que você está falando, e o fez tão rápido ou mais rápido do que o empacotamento codificado manualmente, como o RPC ONC. .

Dito isto, acho que a sua melhor aposta é morder a bala e fazê-lo à mão. É muito difícil analisar C ou C ++ em face de typedefs e macros e assim por diante, então, a menos que você possa pesquisar um struct parser, ou talvez um sistema para ler defs struct e escrever código para traduzir, você acabará fazendo isso à mão. Seja muito organizado. Faça o máximo de verificação mecânica possível. Mesmo contando os elementos "para" e "de" e garantindo que a contagem de correspondências detectará alguns erros.

    
por 31.01.2012 / 17:31
fonte
1

Se você estiver usando código .Net e gerenciado em C ++, poderá pensar em usar o Automapper .

Ainda não encontrei uma abordagem genérica de C ++.

    
por 31.01.2012 / 18:04
fonte
1

Não há uma maneira de gerenciar isso em C / C ++ durante a execução em tempo de execução, uma vez que esses idiomas não suportam reflexão. No entanto, existem métodos que podem ajudar durante o tempo de design, como uma ferramenta de geração de código. Existem muitas ferramentas de geração de código (um simples google ajudará você a identificá-las).

Se você usar o Excel, poderá tentar o seguinte: Coloque cada uma de suas estruturas em colunas diferentes. Em seguida, usando uma fórmula personalizada (como correspondência de nome / tipo), preencha uma coluna com os resultados de mapeamento pretendidos. Em seguida, basta copiar / colar os resultados do mapeamento em um arquivo de texto e concluí-lo quando necessário. Essa abordagem não vai te deixar 100% lá, mas pode ser um bom ponto de partida para ajudar a facilitar o processo.

    
por 31.01.2012 / 20:05
fonte

Tags