Bu hangi sorunu çözer?
Bkz DIETMAR yanıtını ve remyabel cevabını .
ve bu standart konteynerlerin çalışma şeklini değiştiriyor mu?
Hayır, varsayılan olarak değil.
Yeni üye işlev şablonu aşırı yüklemeleri find
vb., Anahtar türünün kendisini kullanmak yerine kapsayıcının anahtarıyla karşılaştırılabilir bir tür kullanmanıza izin verir. Gerekçe ve bu özelliği eklemek için ayrıntılı, dikkatlice yazılmış bir teklif için Joaquín Mª López Muñoz tarafından hazırlanan N3465'e bakın .
Bristol toplantısında LWG, heterojen arama özelliğinin yararlı ve arzu edilir olduğu konusunda hemfikirdi, ancak Joaquin'in teklifinin her durumda güvenli olacağından emin olamadık. N3465 önerisi bazı programlar için ciddi sorunlara neden olabilirdi ( Mevcut koda etkisi bölümüne bakın). Joaquín, LWG'nin artılarını ve eksilerini anlamasına yardımcı olmak için çok yararlı olan, farklı ödünleşimlere sahip bazı alternatif uygulamalarla güncellenmiş bir taslak teklif hazırladı, ancak hepsi bazı programları bir şekilde kırma riskini aldılar, bu nedenle özelliği eklemek için bir fikir birliği yoktu. Özelliği koşulsuz olarak eklemenin güvenli olmamasına rağmen, varsayılan olarak devre dışı bırakılmasının ve yalnızca "etkinleştirilmesinin" güvenli olacağına karar verdik.
N3657 teklifinin temel farkı ( benim ve N3465'e dayanan STL'nin son dakika revizyonu ve Joaquín tarafından daha sonra yayınlanmamış bir taslaktı), is_transparent
yeni işlevselliği seçmek için kullanılabilecek protokol olarak türü eklemekti .
Bir "şeffaf işlevci" (yani bir is_transparent
türü tanımlayan ) kullanmazsanız, kaplar her zaman yaptıkları gibi davranır ve bu hala varsayılan değerdir.
Eğer kullanım tercih IFF std::less<>
(14 C ++ için yeni olan) ya da başka bir "şeffaf funktor" o zaman yeni işlevi olsun yazın.
std::less<>
Takma ad şablonlarıyla kullanmak kolaydır:
template<typename T, typename Cmp = std::less<>, typename Alloc = std::allocator<T>>
using set = std::set<T, Cmp, Alloc>;
İsim , C ++ 14'e "elmas operatörlerini" ekleyen STL'nin N3421'denis_transparent
geliyor . "Şeffaf bir işlev", herhangi bir bağımsız değişken türünü (aynı olması gerekmez) kabul eden ve bu bağımsız değişkenleri başka bir operatöre ileten bir işlevdir. Böyle bir işlev, ilişkisel kaplarda heterojen arama için tam olarak istediğiniz şey olur, bu nedenle tür , tüm elmas işleçlerine eklendi ve yeni işlevselliğin ilişkili kaplarda etkinleştirilmesi gerektiğini belirtmek için etiket türü olarak kullanıldı. Teknik olarak, kapsayıcıların "şeffaf bir işleve" ihtiyacı yoktur, yalnızca onu heterojen türlerle çağırmayı destekleyen biri (örneğin, https://stackoverflow.com/a/18940595/981959'daki tür STL'nin tanımına göre şeffaf değildir,is_transparent
pointer_comp
pointer_comp::is_transparent
sorunu çözmek için kullanılmasına izin verir). Eğer sadece hiç Gözlerinde farklı arama ederse std::set<T, C>
Çeşidi tuşlarıyla T
veya int
sonra C
sadece Çeşidi argümanlarla çağrılabilir olması gerekir T
ve int
(her iki sırada), gerçekten şeffaf olması gerekmez. Bu adı kısmen daha iyi bir isim bulamadığımız için kullandık (Bu is_polymorphic
tür işlevler statik polimorfizm kullandığı için tercih ederdim , ancak zaten std::is_polymorphic
dinamik polimorfizmi ifade eden bir tür özelliği var).