C dizisi başlatma taklit&; int arr "[nasıl] = { e1, e2, e3, ...}&; std davranışları ile":: dizi?
(Not: Bu soruyu öğe sayısını belirtin ve hala iç içe türü doğrudan başlatılması için izin vermek demektir.)
This question C kullanan bir dizi için sol int arr[20];
gibi anlatılır. his answer, @James Kanze C diziler son kalelerinden biri şovları, benzersiz başlatma özellikleri:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Elemanları, Yaşasın sayısını belirtmek zorunda değiliz! Şimdi C 11 fonksiyonları std::begin
<iterator>
std::end
ile üzerinde yineleme (**20) ve sen hiç kendi boyutunda düşünmek gerekir.
Şimdi, (belki) TMP std::array
ile aynı elde etmek için herhangi bir yolu var mı? Makroları kullanarak daha güzel görünmesini sağladı. :)
??? std_array = { "here", "be", "elements" };
Edit: Ara sürüm, çeşitli yanıtlar derlenmiş, bu gibi görünüyor
#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);
Ve C 11 havalı şeyler kullanır:
- Variadic Şablonları
sizeof...
- rvalue başvurular
- mükemmel iletme
std::array
, tabii ki- üniforma başlatma
- üniforma başlatma dönüş tipi atlama
- tür kesmesi (
auto
)
Ve bir örnek here bulunabilir.
Ancak@Johannes dışarı @Xaade cevabı konusunda yorum yaparak puan olarak, böyle bir işlevi ile iç içe türü başlatabilir. Örnek:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Ayrıca, başlatıcılar sayısı ve işlev şablonu argümanları uygulaması tarafından desteklenen sayısı sınırlıdır.
CEVAP
Aklıma en iyisidir:
template<class T, class... Tail>
auto make_array(T head, Tail... tail) -> std::array<T, 1 sizeof...(Tail)>
{
std::array<T, 1 sizeof...(Tail)> a = { head, tail ... };
return a;
}
auto a = make_array(1, 2, 3);
Ancak, bu derleyici NRVO yapmak gerekir, ve sonra da dönen değer kopyasını da yasal ama gerekli değil) atlayın. Uygulamada, herhangi bir C derleyici doğrudan başlatma kadar hızlı gibi optimize etmek için mümkün olur.
Çok boyutlu bir dizi ve C dizi dizisi ...
'Dizisi kullanımı ne.prototip.dil...
Köşeli parantez C dizisi başlatma ne d...
JavaScript "Dizi(n)" yeni; ve...
C 0'dan başlatma dizisi...