SORU
24 Mayıs 2011, Salı


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
24 Mayıs 2011, Salı


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • Turkish Airlines

    Turkish Airl

    11 AĞUSTOS 2006