2015-12-25 16 views
10

voglio scrivere alcune variabili comeCome digitare un file std :: array con una dimensione non specificata?

std::array<double, array_num> a; 

dove array_num è un const int che rappresenta la lunghezza dell'array. Ma è lungo e voglio creare un alias per esso:

typedef std::array<double, array_num> my_array; 

è giusto? Come posso usare my_array come my_array<3>?

+0

Un 'std :: array' ha un'espressione di * costante * dimensione. Non può essere una variabile. Se vuoi che sia una variabile, vuoi 'std :: vector' o forse qualche futuro' std :: dynarray' (in qualche futuro standard per C++) –

risposta

27

Quello che vi serve è un alias template:

template <size_t S> 
using my_array = std::array<double, S>; 

Non è possibile effettuare direttamente un modello typedef, vedere this post.

size_t è il tipo del secondo parametro modello std::array prende, non int.

Ora che sai di using, si dovrebbe essere utilizzando tale. Può fare tutto ciò che fa typedef, oltre a questo. Inoltre, lo leggi da sinistra a destra con un bel segno = come delimitatore, al contrario di typedef, che a volte può far male ai tuoi occhi.


Permettetemi di aggiungere altri due esempi di utilizzo:

template <typename T> 
using dozen = std::array<T, 12>; 

E se si voleva creare un alias per std::array, così com'è, avresti bisogno di imitare la sua firma modello:

template <typename T, size_t S> 
using my_array = std::array<T, S>; 

- perché questo non è consentito:

using my_array = std::array; 
+2

Grazie mille! 'using' è molto meglio, così come' size_t'. – yikouniao

+0

'size_t' è il tipo del secondo parametro del modello' std :: array' e viene utilizzato per le dimensioni di tutti i contenitori standard. Su x86-64, 'int' ha 4B, mentre' size_t' ha 8B. Semplicemente non vuoi che 'int' scherzi da queste parti. Non è nemmeno "non firmato". – LogicStuff

+0

@yikouniao Aggiunte alcune informazioni aggiuntive e inoltre, l'argomento del modello non può essere una variabile, come lo avete espresso nella vostra domanda. – LogicStuff