Esiste un modo efficace per adattare i dati da una struttura all'altra in c ++?

5

Sto scrivendo un'interfaccia tra due modelli di configurazione che utilizzano strutture diverse. Pur sapendo che non esiste un modo "magico" per tradurre da un tipo di struttura a un altro, ho vagato se ci fossero alcune buone pratiche o un modo efficiente / efficace per configurare un tale sistema. Penso che sia simile a come i programmi possono gestire diverse strutture di configurazione attraverso le versioni.

Ecco un semplice esempio: diciamo che abbiamo una struttura di tipo A che contiene 3 parametri:

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

La seconda struttura di configurazione condivide gli stessi parametri, ma in un ordine diverso, vediamo la struttura B:

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

Un semplice programma per convertire un A in un B sarebbe:

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

Quindi, anche se questo può sembrare abbastanza semplice con tali strutture di base, ho a che fare con dozzine di strutture, ognuna delle quali contiene circa 50 parametri. Quindi qualcuno sa di un buon modello da seguire per un simile problema?

    
posta Alex Garcia 31.01.2012 - 17:21
fonte

3 risposte

5

Alcune delle ricerche successive sull'ottimizzazione Remote Procedure Call hanno riguardato problemi come questo. L'unico che posso ricordare e trovare è Flux RPC. Queste persone hanno scritto un documento sull'ottimizzazione RPC del 1995 che potrebbe suscitare interesse per te. Se ricordo male (non ho riletto il foglio), avevano un codice di serializzazione / marshalling che faceva più o meno quello di cui stai parlando, e lo faceva veloce o più veloce di un marshalling codificato a mano, come ONC RPC .

Detto questo, penso che la cosa migliore da fare sia mordere il proiettile e farlo a mano. È piuttosto difficile analizzare C o C ++ di fronte a typedef e macro e così via, quindi a meno che non si riesca a individuare un parser di struct, o magari un sistema a leggere struct def e scrivere codice per tradurre, finirai per farlo a mano. Sii molto organizzato Fai più controlli meccanici che puoi. Anche contando gli elementi "a" e "da" e assicurando che la corrispondenza dei conteggi catturi alcuni errori.

    
risposta data 31.01.2012 - 17:31
fonte
1

Se usi il codice C ++ .Net e gestito, potresti pensare di utilizzare Automapper .

Non ho ancora trovato un approccio C ++ generico.

    
risposta data 31.01.2012 - 18:04
fonte
1

Non esiste un modo per gestirlo in C / C ++ durante l'esecuzione in runtime poiché questi linguaggi non supportano il reflection. Tuttavia, ci sono metodi che possono aiutare durante la fase di progettazione, ad esempio uno strumento di generazione del codice. Esistono molti strumenti per la generazione del codice (un semplice google ti aiuterà a identificarli).

Se si utilizza Excel, è possibile provare quanto segue: posizionare ciascuna delle strutture in colonne diverse. Quindi, utilizzando una formula personalizzata (come la corrispondenza nome / tipo), compilare una colonna con i risultati di mappatura previsti. Quindi, semplicemente copia / incolla i risultati della mappatura in un file di testo e completalo dove necessario. Questo approccio non ti porterà al 100% ma potrebbe essere un buon punto di partenza per facilitare il processo.

    
risposta data 31.01.2012 - 20:05
fonte

Leggi altre domande sui tag