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
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)
veend(__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ınbegin
end
ADL (basitleştirilmiş versiyon: sınıf olarak aynı ad koydum) tarafından bulunacak ücretsiz işlevleri tanımlamakstd::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.
Nasıl "düzgün" JavaScript öz...
İçinde Node.js nasıl "vardır"...
&Quot Geçersiz kılmak İçin Nasıl Andro...
Tanımlamak için nasıl "türü bir ç...
Nasıl "Kopyala Çıkış Dizin ve Bir...