Domanda

Ci sono problemi che potrebbero rendere il sistema di generazione del codice del modello T4 di MS inadatto alla generazione del codice C ++?

È stato utile?

Soluzione

Può generare qualsiasi testo tu voglia, incluso il codice C ++.

Altri suggerimenti

Una risposta un po 'lunga, ma penso che alcuni potrebbero trovarlo interessante

Direi che T4 è eccellente per generare C ++ con

Alcuni potrebbero ripetere che C ++ ha già degli strumenti per fare MetaProgramming con like:

Il preprocessore

Usando il preprocessore e le macro di ordine superiore puoi ottenere un po 'quello che puoi fare con T4, ma dico che ci sono alcuni vantaggi abbastanza convincenti di T4:

  1. Il codice generato da T4 è di facile debug e comprensione
  2. MetaProgramming con T4 è più semplice rispetto al preprocessore. Il preprocessore può eseguire macro come max / min abbastanza facilmente ma quando parliamo di modelli basati su modelli diventa difficile
  3. T4 è più potente del preprocessore, rendendo più semplice lo sviluppo dei template
  4. T4 può essere eseguito come parte del processo di compilazione o su richiesta

Specializzazione modello parziale

Adoro i trucchi di specializzazione parziale dei template ma parlo per esperienza che non a tutti piace mantenerli.

Ho sempre cercato di ridurre le ridondanze del codice nel tentativo di aumentare la manutenibilità. Inoltre, quando possibile, preferisco gli errori di compilazione rispetto agli errori di runtime. Quindi dopo aver letto Modern C ++ di Andrei Alexandrescu ho pensato di aver trovato la risposta .

Ho scritto un componente ispirato a questo libro che ha funzionato alla grande, poi sono andato in vacanza. Quando sono tornato, il team aveva eliminato il componente e riscritto il proprio utilizzando tecniche tradizionali. Conteneva più codice, era più buggier e non funzionava altrettanto bene, ma non riuscivano a capire come aggiungere la funzionalità al Componente che avevo scritto e determinato che dovevano farlo. Niente potrebbe essere salvato. Anche questi erano ragazzi intelligenti.

Hanno sbagliato a farlo? In termini di manutenibilità direi che hanno fatto la scelta giusta anche se mi rattrista.

Il mio punto con questo aneddoto è che T4 ha alcuni vantaggi rispetto ai trucchi di specializzazione parziale del modello:

  1. Il codice generato da T4 è di facile debug e comprensione
  2. T4 è più semplice
  3. T4 è più potente
  4. T4 può essere eseguito parte del processo di compilazione o su richiesta
  5. Se i manutentori riescono ad aggirare il modello T4, possono comunque recuperare il codice (iniziare a mantenere il codice generato e buttare via il modello). Ciò non era possibile nell'aneddoto sopra.

Ovviamente in C ++ MetaProgramming è una combinazione di PreProcessor e specializzazione di template parziale.

Inconvenienti

Naturalmente ci sono degli svantaggi con T4;

  1. È specifico di Visual Studio (o specifico di Mono). Tuttavia, il codice generato può ovviamente essere compilato da GCC e altri.
  2. Non è standard
  3. I progetti Visual Studio C ++ non sembrano supportare T4, il che mi costringe a usare un finto progetto .NET per generare il codice frmo.

Conclusione

Tutto sommato ho perso interesse nel fare MetaProgramming C ++ avanzato usando trucchi fantasiosi con il PreProcessor o il sistema dei tipi (li uso comunque per compiti più semplici) e per il momento mi affido a T4.

Se qualcuno è interessato a un esempio su come farlo in C ++, puoi dare un'occhiata a InteractiveGraphics . È una libreria per C #, VB, PowerShell e SmallBasic per eseguire semplici grafiche. Lì uso T4 per generare tutte le API e il codice boilerplate per i messaggi che passano tra .NET e C ++ (non uso C ++ / CLI se posso evitarlo tutto) da un modello che descrive l'API. Aggiungere un nuovo metodo è semplice come estendere il modello e rigenerare tutti i file temlate, quindi implemento un metodo astratto in C ++ e faccio cose divertenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top