(Not: Bu soru, öğelerin sayısını belirtmemek ve yine de iç içe türlerin doğrudan başlatılmasına izin vermek zorunda değildir.)
Bu soru , C dizisi için kalan kullanımları tartışmaktadır int arr[20];
. On onun cevabı , C diziler son kalelerinden @James Kanze gösterileri biri, benzersiz başlatma özellikleri var:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Eleman sayısını belirtmek zorunda değiliz, yaşasın! Şimdi yinelerler C ++ 11 fonksiyonları ile bitti std::begin
ve std::end
gelen <iterator>
( veya kendi varyantları ) ve asla hatta kendi boyutunda düşünmek gerekir.
Şimdi, bunu başarmanın (muhtemelen TMP) yolları var std::array
mı? Makroların daha güzel görünmesine izin verilir. :)
??? std_array = { "here", "be", "elements" };
Düzenleme : Çeşitli cevaplardan derlenen ara sürüm şu şekilde görünür:
#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 her türlü havalı C ++ 11 işini kullanır:
- Değişken Şablonlar
sizeof...
- rvalue referansları
- mükemmel yönlendirme
std::array
, elbette- düzgün başlatma
- Tek tip başlatma ile geri dönüş tipinin çıkarılması
- tür çıkarımı (
auto
)
Ve burada bir örnek bulabilirsiniz .
Bununla birlikte , @Johannes @ Xaade'nin cevabındaki yorumda belirttiği gibi, yuvalanmış türleri böyle bir işlevle başlatamazsınız. Misal:
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ı sayısı, uygulama tarafından desteklenen işlev ve şablon bağımsız değişkenlerinin sayısı ile sınırlıdır.
TMP
sorunuzun anlamı nedir?