(Uwaga: to pytanie dotyczy braku konieczności określania liczby elementów i nadal zezwala na bezpośrednie inicjowanie typów zagnieżdżonych).
To pytanie omawia zastosowania pozostawione dla tablicy C, takiej jak int arr[20];
. W swojej odpowiedzi @James Kanze pokazuje jeden z ostatnich bastionów tablic C, jego unikalne cechy inicjalizacji:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Nie musimy określać liczby elementów, hura! Teraz iteruj go za pomocą funkcji C ++ 11 std::begin
i std::end
from <iterator>
( lub własnych wariantów ) i nigdy nie musisz nawet myśleć o jego rozmiarze.
Czy są jakieś sposoby (prawdopodobnie TMP), aby osiągnąć to samo std::array
? Zastosowanie makr pozwoliło uatrakcyjnić wygląd. :)
??? std_array = { "here", "be", "elements" };
Edycja : wersja pośrednia, skompilowana z różnych odpowiedzi, wygląda następująco:
#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);
I używa wszelkiego rodzaju fajnych rzeczy C ++ 11:
- Szablony Variadic
sizeof...
- odniesienia do wartości r
- doskonała spedycja
std::array
, oczywiście- jednolita inicjalizacja
- pomijanie zwracanego typu przy jednolitej inicjalizacji
- wnioskowanie o typie (
auto
)
Przykład można znaleźć tutaj .
Jednak , jak @Johannes wskazuje w komentarzu do odpowiedzi @ Xaade, nie możesz zainicjować zagnieżdżonych typów za pomocą takiej funkcji. Przykład:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Ponadto liczba inicjatorów jest ograniczona do liczby argumentów funkcji i szablonów obsługiwanych przez implementację.
TMP
twojego pytania?