Domanda

Nella mia domanda precedente ho fatto è possibile l'istanziazione del modello esplicito ricorsivo. Ho visto che è davvero possibile; Tuttavia, questa istanza risulta essere efficace solo a livello locale, i simboli del modello istanziato ricorsivamente non vengono esportati nel file oggetto e quindi non vengono visualizzati nella libreria (condivisa). Quindi faccio una domanda qui più precisamente come nel mio post precedente:

Dato un modello come

template<int dim> class Point { ... };

Questo modello può essere esplicitamente simile

template class Point<0>;
template class Point<1>;
template class Point<2>;
template class Point<3>;

che esporta i simboli di Point<0>, ..., Point<3> Nel file oggetto dell'unità di traduzione corrente. Invece di istanziare ogni modello individualmente come sopra, vorrei istanziarli in modo ricorsivo con una sola chiamata.

Qualsiasi soluzioni che raggiunge questo va bene, sia nello stile della meta-programming del modello, tramite una classe helper come

template class RecursiveInstantiate<Point, 3>;

o tramite il preprocessore. Qui ho esaminato la libreria preprocessore boost, che sembra avere alcuni costrutti ad anello. Tuttavia, non ho mai usato la libreria di preprocessore Boost (qualsiasi consiglio è apprezzato) ma a prima vista sono scettico se i loop possono essere usati insieme a un'istanza del modello esplicito.

Qualsiasi consiglio, anche una spiegazione del perché è impossibile ciò che voglio ottenere è apprezzato.


In effetti sono interessato a generalizzare questo per le classi con più parametri di modello comeNode<int i1,int i2,int i3> Per tutta la combinazione di i1, i2, i3 in {0,1,2,3}. Ma spero di poter elaborare questa seconda parte da solo. Come al solito, voglio utilizzare le istanziazioni esplicite per accelerare i tempi di compilazione definendo solo i modelli in un'unità di traduzione, quindi ho bisogno che i metodi per essere esportati nel file oggetto.

Spero che in una soluzione indipendente dal compilatore, ma se ciò non è possibile ne ho bisogno per Linux con G ++/Clang.


Vedi sotto per un sondaggio sulle soluzioni che ho ottenuto e delle soluzioni finali che ne ho fatto.

Nessuna soluzione corretta

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