SORU
17 Kasım 2011, PERŞEMBE


Benim özel bir türü ile çalışmak nasıl "aralığı tabanlı döngüler"?

Birçok kişi bu gün gibi C 11 getiren farklı özelliklere çalışıyorum. Benim favorilerimden biri olan "Aralık tabanlı for döngüleri".

Anlıyorum:

for(Type& v : a) { ... }

Eşittir:

for(auto iv = begin(a); iv != end(a);   iv)
{
  Type& v = *iv;
  ...
}

Ve o begin() sadece standart kaplar için a.begin() verir.

Ama eğer istersem ne olurözel benim tipim "döngü aralığı tabanlı"duyarlı olun?

Sadece begin() end() uzmanlaşmak gerekir ?

Eğer benim özel tip ad xml, xml::begin() std::begin() tanımlamak gerekir ? aitse

Kısacası, kurallar ne için vardır ?

CEVAP
17 Kasım 2011, PERŞEMBE


Standart ilgili bölüm/1 6.5.4

eğer _RangeT sınıf türü ise, niteliksiz-kimlikleri başlangıç ve bitiş vardır sınıf üyesi erişim gibi sınıf _RangeT kapsamında baktı eğer birini veya her ikisini de en az bir bildirisi bulursa,arama (3.4.5) ve başlamak - ifade ve ifadeyi sonuna __range.begin() __range.end(), sırasıyla;

— aksi takdirde, başlamak-ifade ve ifadeyi sonuna begin(__range) ve end(__range), başlangıç ve bitiş sırasıyla, birlikte aranır bağımlı değişken arama (3.4.2). Bu ismin amaçlı arama, ad std ilişkili bir ad.

Bu yüzden, aşağıdakileri yapabilirsiniz:

  • begin end üye işlevlerini tanımlayın
  • begin end ADL (basitleştirilmiş versiyon: sınıf olarak aynı ad koydum) tarafından bulunacak ücretsiz işlevleri tanımlamak
  • std::begin std::end uzmanım

std::begin begin() üye sadece yukarıda biri uygulandıktan sonra sonuçlar aynı seçerseniz seçin bu olmalı zaten işlevini çağırır. Aynı sonuçları için değişiyordu tabanlı döngüler için de aynı sonuç için ölümlü bir kod yok, kendi büyülü adı çözüm kuralları sadece mu using std::begin; ardından bir niteliksiz aramak için begin(a).

Üye fonksiyonları uygulamakveADL işlevleri olsa da, o zaman döngüler ölümlüler ADL işlevleri arayacak ise üye işlevleri çağırmak gerekir tabanlı aralığı. En iyi emin ol o durumda aynı şeyi yapıyorlar!

Eğer yazdığın şeyi kapsayıcı arabirimi uygulayan, yeterli olmalı begin() end() üye fonksiyonlar zaten var. Eğer bir kaba sabit olup eğer boyutunu biliyor musun eğer iyi bir fikir olacaktır) olmayan bir yelpazede, seçmek için özgürsünüz.

Bu seçeneğin yatıyordu, unutmayınolmamalıdıraşırı 27**. Kullanıcı tanımlı bir türü için standart şablonlar uzmanlaşmak için izin verilir, ama bunun dışında, ad std tanımları ekleme tanımsız davranıştır. Ama yine de, standart fonksiyonlar uzmanlaşmış kısmi fonksiyon uzmanlık eksikliği sadece bir sınıf şablonu için tek bir sınıf için değil anlamına gelir çünkü eğer sadece kötü bir seçimdir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alfredo Garcia

    Alfredo Garc

    25 Mayıs 2007
  • Brendan van Son

    Brendan van

    5 Aralık 2006
  • njhaley

    njhaley

    24 NİSAN 2006