Menggunakan alias template di atas template

Jan 09 2021

Membaca buku A tour of c ++ (second edition), 2018 , saya tidak mengerti penjelasan tentang template (akan saya jelaskan di bawah).

Dua tanda tangan fungsi diberikan untuk find_allfungsi yang mengembalikan a vectordari iterators ke semua kemunculan dari nilai tertentu dalam suatu nilai 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) ;

Keduanya bisa digunakan seperti ini:

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

Dikatakan bahwa # 2 menggunakan template alias

sembunyikan detail implementasi dengan memasukkan alias tipe untuk Iterator

oleh penulis.

Meskipun saya rasa saya memahami kedua penggunaan template, saya tidak mengerti mengapa # 2 "menyembunyikan detail implementasi" dan mengapa ini lebih disukai ... Adakah yang bisa menjelaskan kepada saya?

Terima kasih!

postscriptum : Saya tidak memberikan definisi fungsi (sama untuk kedua tanda tangan) pada posting karena menurut saya ini tidak berguna, tetapi saya akan menambahkannya jika ada yang membutuhkannya.

Jawaban

6 NathanOliver Jan 09 2021 at 05:54

Katakanlah Anda memiliki basis kode seperti

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);
...

Jika Anda memutuskan ingin mengubah untuk mengembalikan vektor const_iteratordaripada iterator, Anda harus mengubah semua fungsi tersebut. Ketika menggunakan

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);

yang harus Anda lakukan hanyalah berubah

template<typename T>
using Iterator = typename T::iterator;

untuk

template<typename T>
using Iterator = typename T::const_iterator;

dan selesai. Beginilah cara "menyembunyikan detail implementasi".