(Remarque: Cette question est à propos de ne pas avoir à spécifier le nombre d'éléments et permettent encore les types imbriqués être initialisée directement.)
Cette question traite de l'utilisation à gauche pour un C tableau comme int arr[20];
. Sur sa réponse, @James Kanze montre l'un des derniers bastions de C des tableaux, il est unique initialisation caractéristiques:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Nous n'avons pas à spécifier le nombre d'éléments, hourra! Maintenant parcourir avec le C++11 fonctions, std::begin
et std::end
de <iterator>
(ou vos propres variantes) et vous ne devez même pas penser à sa taille.
Maintenant, il y a de tout (éventuellement TMP) des moyens de réaliser la même chose avec std::array
? L'utilisation de macros a permis de le rendre plus agréable. :)
??? std_array = { "here", "be", "elements" };
Edit: version Intermédiaire, compilées à partir des réponses très diverses, ressemble à ceci:
#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);
Et emploie toutes sortes de cool C++11 trucs:
- Variadic Templates
sizeof...
- références rvalue
- le transfert parfait
-
std::array
, bien sûr - l'initialisation uniforme
- en omettant le type de retour avec l'initialisation uniforme
- l'inférence de type (
auto
)
Et un exemple peut être trouvé ici.
Cependant, comme @Johannes points dans le commentaire sur @Xaade réponse, vous ne pouvez pas initialiser les types imbriqués avec une telle fonction. Exemple:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Aussi, le nombre de initialiseurs est limité au nombre de fonction et les arguments de modèle pris en charge par la mise en œuvre.