2015-04-17 16 views
24

Se ho il seguente codice:la creazione di istanze di template

template <typename T = int> 
struct mystruct { 
    using doublestruct = mystruct<double>; 
} 

mystruct<>::doublestruct obj; 

Questo istanziare il modello mystruct<int> a tutti? O solo il mystruct<double> viene istanziato?

+0

Non ha utilizzato il tipo "T" nel modello. Cosa stai cercando di ottenere con questo modello? –

+3

@MykhayloKopytonenko: È un esempio forzato. Un ottimo banco di prova, in realtà. Sta chiedendo se un modello viene istanziato quando è denominato solo per nominare un tipo di membro [non dipendente] dichiarato al suo interno. –

risposta

18

Sì, sarà necessario creare un'istanza mystruct<int> per accedere ai relativi membri e determinare il significato di doublestruct. Si potrebbe provare questo con un static_assert:

#include <type_traits> 

template <typename T = int> 
struct mystruct { 
    static_assert(!std::is_same<T,int>::value, ""); 
    using doublestruct = mystruct<double>; 
}; 

mystruct<>::doublestruct obj;  // assertion fails for T==int 
mystruct<char>::doublestruct obj; // OK, not instantiated for int 
+1

mebe usare qualcosa di diverso da 'double' per questa dimostrazione; un pò confuso –

+0

@LightningRacisinObrit: OK, credo. –

16

Sì, deve essere istanziato; doublestruct è un membro dell'istanza, quindi, se non si dispone di un'istanza, non si dispone di doublestruct.

[C++11: 14.7.1]: A meno che un modello di classe di specializzazione è stato esplicitamente istanziato (14.7.2) o esplicitamente specializzata (14.7.3), la specializzazione modello di classe è implicitamente un'istanza quando la specializzazione viene fatto riferimento in un contesto che richiede un completely- tipo di oggetto definito o quando la completezza del tipo di classe influenza la semantica del programma. [..]

In particolare, si consideri l'effetto potenziale di specializzazioni di mystruct che possono non contenere un membro doublestruct, o possono contenere uno che non è un tipo.

Problemi correlati