(Nota: Esta pregunta es no tener que especificar el número de elementos y todavía permitir tipos anidados a ser inicializados directamente.)
Esta pregunta se analizan los usos izquierda para una matriz C como int arr[20];
. En su respuesta , @James Kanze muestra una de las últimas fortalezas de las matrices C, sus características de inicialización únicas:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
No tenemos que especificar el número de elementos, ¡hurra! Ahora repita sobre él con las funciones de C ++ 11 std::begin
y std::end
desde <iterator>
( o sus propias variantes ) y nunca tendrá que pensar siquiera en su tamaño.
Ahora, ¿hay alguna forma (posiblemente TMP) de lograr lo mismo std::array
? El uso de macros permitió que se vea mejor. :)
??? std_array = { "here", "be", "elements" };
Editar : La versión intermedia, compilada a partir de varias respuestas, se ve así:
#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);
Y emplea todo tipo de cosas interesantes de C ++ 11:
- Plantillas Variadas
sizeof...
- referencias de valor
- reenvío perfecto
std::array
, por supuesto- inicialización uniforme
- omitiendo el tipo de retorno con inicialización uniforme
- inferencia de tipos (
auto
)
Y un ejemplo se puede encontrar aquí .
Sin embargo , como @Johannes señala en el comentario sobre la respuesta de @ Xaade, no puede inicializar tipos anidados con dicha función. Ejemplo:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Además, el número de inicializadores se limita al número de argumentos de función y plantilla admitidos por la implementación.
TMP
tu pregunta?