(Nota: questa domanda riguarda il non dover specificare il numero di elementi e consentire comunque l'inizializzazione diretta dei tipi nidificati.)
Questa domanda discute gli usi rimasti per un array C come int arr[20];
. Sulla sua risposta , @James Kanze mostra una delle ultime roccaforti degli array C, le sue caratteristiche di inizializzazione uniche:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Non dobbiamo specificare il numero di elementi, evviva! Ora iteralo su di esso con le funzioni C ++ 11 std::begin
e std::end
da <iterator>
( o le tue varianti ) e non hai mai nemmeno bisogno di pensare alle sue dimensioni.
Ora, ci sono modi (possibilmente TMP) per ottenere lo stesso risultato std::array
? L'uso di macro ha permesso di renderlo più bello. :)
??? std_array = { "here", "be", "elements" };
Modifica : la versione intermedia, compilata da varie risposte, si presenta così:
#include <array>
#include <utility>
template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
return { std::forward<T>(head), std::forward<Tail>(values)... };
}
// in code
auto std_array = make_array(1,2,3,4,5);
E impiega tutti i tipi di cose interessanti in C ++ 11:
- Modelli variabili
sizeof...
- riferimenti di valore
- spedizione perfetta
std::array
, ovviamente- inizializzazione uniforme
- omettendo il tipo restituito con inizializzazione uniforme
- tipo inferenza (
auto
)
E un esempio può essere trovato qui .
Tuttavia , come sottolinea @Johannes nel commento sulla risposta di @ Xaade, non è possibile inizializzare i tipi nidificati con tale funzione. Esempio:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Inoltre, il numero di inizializzatori è limitato al numero di argomenti di funzione e modello supportati dall'implementazione.
TMP
tua domanda?