(Catatan: Pertanyaan ini tentang tidak memiliki untuk menentukan jumlah elemen dan masih memungkinkan bersarang jenis akan langsung diinisialisasi.)
Pertanyaan ini membahas penggunaan tersisa untuk array C seperti int arr[20];
. Pada jawabannya , @James Kanze menunjukkan salah satu benteng terakhir array C, itu karakteristik inisialisasi yang unik:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Kami tidak harus menentukan jumlah elemen, hore! Sekarang lakukan iterasi dengan fungsi C ++ 11 std::begin
dan std::end
dari <iterator>
( atau varian Anda sendiri ) dan Anda bahkan tidak perlu memikirkan ukurannya.
Sekarang, apakah ada cara (mungkin TMP) untuk mencapai hal yang sama std::array
? Penggunaan macro dibolehkan agar terlihat lebih bagus. :)
??? std_array = { "here", "be", "elements" };
Edit : Versi menengah, disusun dari berbagai jawaban, terlihat seperti ini:
#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);
Dan menggunakan semua jenis C ++ 11 yang keren:
- Template Variadic
sizeof...
- rvalue referensi
- penerusan sempurna
std::array
, tentu saja- inisialisasi seragam
- menghilangkan tipe pengembalian dengan inisialisasi seragam
- ketik inferensi (
auto
)
Dan contohnya dapat ditemukan di sini .
Namun , seperti yang ditunjukkan @Johannes dalam komentar pada jawaban @ Xaade, Anda tidak dapat menginisialisasi tipe bertingkat dengan fungsi seperti itu. Contoh:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Selain itu, jumlah penginisialisasi dibatasi pada jumlah argumen fungsi dan template yang didukung oleh implementasi.