Şablon yerine şablon takma adı kullanma
Kitap okumak Bir c ++ (ikinci baskı), 2018 turu, şablonlar hakkında bir açıklama anlamadım (aşağıda açıklayacağım).
İki işlev imzalar bir için verilmiştir find_all
bir döndüren fonksiyonu vector
içinde iterator
belirli bir belirli bir değerin geçtiği tüm s container
.
# 1:
template<typename C, typename V>
vector<typename C::iterator> find_all(C& c, V v);
# 2:
template<typename T>
using Iterator = typename T::iterator;
template<typename C, typename V>
vector<Iterator<C>> find_all(C& c, V v) ;
Her ikisi de şu şekilde kullanılabilir:
string m {"Mary had a little lamb"};
for (auto p : find_all(m,'a')) // here p is a string::iterator
cout << *p << endl; // spoiler alert : this will print 'a's
Takma ad kullanan # 2 şablonunun
Yineleyici için bir tür takma adı ekleyerek uygulama ayrıntısını gizleyin
yazar tarafından.
Her iki şablon kullanımını da anladığımı düşünmeme rağmen, neden # 2'nin "uygulama detayını gizlediğini" ve neden tercih edildiğini anlamıyorum ... Biri bana açıklayabilir mi?
Teşekkürler !
postscriptum : Gönderiye işlevlerin tanımını vermedim (her iki imza için de aynı) çünkü kullanışlı olmadığını düşünüyorum, ancak ihtiyacı olursa ekleyeceğim.
Yanıtlar
Diyelim ki bir kod tabanınız var.
template<typename C, typename V>
vector<typename C::iterator> first(C& c, V v);
template<typename C, typename V>
vector<typename C::iterator> second(C& c, V v);
template<typename C, typename V>
vector<typename C::iterator> third(C& c, V v);
template<typename C, typename V>
vector<typename C::iterator> fourth(C& c, V v);
...
Eğer bir vektör dönmek değiştirmeye karar verirseniz const_iterator
yerine iterator
, sen bu işlevlerin tümünü değiştirmek gerekiyordu. Kullanırken
template<typename T>
using Iterator = typename T::iterator;
template<typename C, typename V>
vector<Iterator<C>> first(C& c, V v);
template<typename C, typename V>
vector<Iterator<C>> second(C& c, V v);
template<typename C, typename V>
vector<Iterator<C>> third(C& c, V v);
template<typename C, typename V>
vector<Iterator<C>> fourth(C& c, V v);
tek yapman gereken değişiklik
template<typename T>
using Iterator = typename T::iterator;
-e
template<typename T>
using Iterator = typename T::const_iterator;
ve bitirdiniz. "Uygulama detayını bu şekilde gizler".