Sto usando std::array<size_t, N>
(N è una variabile di modello fissa).C'è un modo per far rispettare l'inizializzazione completa di std :: array
#include<array>
template<size_t N>
struct A{
size_t function(std::array<size_t, N> arr){ return arr[N-1];} // just an example
};
int main(){
A<5> a;
a.function({{1,2,3,4,5}}));
}
E funziona correttamente. Il problema è che questo altro codice è in silenzio consentito:
A.function({{1,2,3}}));
Cioè, anche con elementi perse la array
viene inizializzato in qualche modo, anche se è ben definita (elementi ad esempio rimanenti inizializzato a zero, non sono sicuro) questa è una possibile fonte di errori.
C'è un modo per far rispettare l'inizializzazione degli elementi aggiuntivi? Es. generando un errore del compilatore o un avvertimento.
Una possibilità che ho contemplato è quello di utilizzare initializer_list
size_t function2(std::initializer_list<size_t> il){ assert(il.size() == N); ...}
Il problema è che questo ha generato un errore di runtime al meglio e un controllo in ogni chiamata. Preferirei un errore/avvertimento del compilatore.
Non sono così preoccupato dall'inizializzazione predefinita di std::array<>{}
ma dall'inizializzazione incompleta . (Forse non c'è niente che si può fare a questo proposito, dal momento che questo è ereditato dal comportamento di T[N]
array statico.)
Ho provato ad utilizzare clang 3.5
e gcc 5
.
@texasbruce, grazie, l'ho provato. Il problema è che 'N' in' std :: array 'non può essere dedotto dall'argomento (almeno nel mio compilatore), e da lì in poi' std :: enable_if' non aiuta. O intendi qualcosa di diverso? –
alfC
Ho erroneamente interpretato la tua domanda. enable_if non aiuta qui – texasbruce