Şablon yerine şablon takma adı kullanma

Jan 09 2021

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_allbir döndüren fonksiyonu vectoriçinde iteratorbelirli 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

6 NathanOliver Jan 09 2021 at 05:54

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_iteratoryerine 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".