(Nota: Esta questão é sobre não precisar especificar o número de elementos e ainda permitir que tipos aninhados sejam inicializados diretamente.)
Esta questão discute os usos restantes para uma matriz C como int arr[20];
. Em sua resposta , @James Kanze mostra uma das últimas fortalezas das matrizes C, são características únicas de inicialização:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Não precisamos especificar o número de elementos, viva! Agora, itere-o com as funções C ++ 11 std::begin
e std::end
com <iterator>
( ou suas próprias variantes ) e você nunca precisa nem pensar em seu tamanho.
Agora, existem formas (possivelmente TMP) de conseguir o mesmo std::array
? Uso de macros permitidas para torná-lo mais agradável. :)
??? std_array = { "here", "be", "elements" };
Edit : Versão intermediária, compilada a partir de várias respostas, tem a seguinte aparência:
#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 emprega todo o tipo de coisas legais em C ++ 11:
- Modelos Variadic
sizeof...
- referências rvalue
- encaminhamento perfeito
std::array
, claro- inicialização uniforme
- omitindo o tipo de retorno com inicialização uniforme
- inferência de tipo (
auto
)
E um exemplo pode ser encontrado aqui .
No entanto , como @Johannes aponta no comentário da resposta do @ Xaade, você não pode inicializar tipos aninhados com essa função. Exemplo:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Além disso, o número de inicializadores é limitado ao número de argumentos de função e modelo suportados pela implementação.
TMP
sua pergunta?