Menggunakan alias template di atas template
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_all
fungsi yang mengembalikan a vector
dari iterator
s 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
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_iterator
daripada 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".