Domanda

E 'possibile scrivere un modello impuro in C ++? Cioè, un modello che a volte dare un diverso tipo risultante o int per gli stessi parametri di modello. Ad esempio, è possibile scrivere un Foo<T> modello in cui a volte è Foo<int>::type char e in altri momenti float? O un modello in cui Foo<T> Foo<double>::my_static_const_int è a volte 10 e altre volte 20?

È stato utile?

Soluzione

Non è possibile. Se si dispone di un modello che si comporta in questo modo, si viola l'ODR e / o di altre norme, come ad esempio che una specializzazione dovrebbe essere dichiarato prima che sarebbe stato istanziato. Così non si può semplicemente mettere una specializzazione che avrebbe in qualche modo cambiare un membro typedef per rendere risolvere in un tipo diverso per tutti i seguenti riferimenti.

Ricordate che i riferimenti Foo<T> una classe se Foo è un modello di classe. Se membro typedef della classe è definito come un tipo ad un certo punto nel programma, e un altro tipo in un altro punto, poi qualcosa deve essere stato andato storto. Qui ci sono varie citazioni standard che riguardano questo


  

Una specializzazione di modello di funzione, un modello di funzione membro, o di una funzione membro o membro dati statico di una classe template può avere più punti di istanze all'interno di un'unità di traduzione. Una specializzazione per un modello di classe ha al massimo un punto di istanziazione all'interno di un'unità di traduzione. Una specializzazione per qualsiasi modello può avere dei punti di instanziazione in più unità di traduzione. Se due diversi punti di istanziazione danno un modello di specializzazione significati diversi in base alla regola una definizione (3.2), il programma è mal formati, nessun diagnostico richiesto.


  

Se un modello, un modello di membro o il membro di un modello di classe è esplicitamente specializzata allora che la specializzazione deve essere dichiarata prima del primo utilizzo di tale specializzazione che causerebbe un'istanza implicita di prendere posto, in ogni unità di traduzione in cui tale un uso verifica; non è richiesto diagnostica.


(Varie "rumore" saltato)

  

[.. I vari soggetti, che possono essere definiti più in tutto il programma ..]. Data tale un'entità denominato D definita in più di un'unità di traduzione, allora

     
      
  • ciascuna definizione di D comprende la stessa sequenza di token;
  •   
  • in ogni definizione di D, nomi corrispondenti, guardato secondo 3.4, si riferiscono a un'entità definita nella definizione di D, o si riferiscono alla stessa entità, dopo la risoluzione di sovraccarico (13.3) e dopo la compensazione di template parziale specializzazione (14.8.3) ...
  •   
  • Se D è un modello, ed è definito in più di un'unità di traduzione, poi gli ultimi quattro   requisiti dalla lista di cui sopra si applicano ai nomi dal campo di applicazione racchiude del modello utilizzato nella definizione del modello (14.6.3), e anche per i nomi di dipendenti al punto di istanziazione (14.6.2). Se le definizioni di D soddisfano tutti questi requisiti, quindi il programma deve comportarsi come se ci fosse una definizione unica di D. Se le definizioni di D non soddisfano questi requisiti, quindi il comportamento è indefinito.
  •   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top