![](/img/trans.png)
[英]Declare a template function which receives two generic iterator as parameters
[英]Declare a function accepting generic iterator
鑒於此代碼,是否可以更改dumpStrings()
以能夠遍歷任何string
容器,例如list<string>
?
#include <vector>
#include <string>
#include <ostream>
#include <iostream>
using namespace std;
void dumpStrings(vector<string>::iterator it, vector<string>::iterator end)
{
while (it != end) {
cout << *it++ << endl;
}
}
int main()
{
vector<string> strVector;
strVector.push_back("Hello");
strVector.push_back("World");
dumpStrings(strVector.begin(), strVector.end());
return 0;
}
創建一個模板
template<class iterator_type>
void dumpStrings(iterator_type it, iterator_type end)
{
while (it != end) {
cout << *(it++) << endl;
}
}
該模板還將容器值類型的限制刪除為字符串。 請注意,您需要圍繞它的括號++。
是
http://www.boost.org/doc/libs/1_45_0/libs/utility/enable_if.html
http://www.cplusplus.com/reference/std/iterator/iterator_traits/
template<class I>
typename enable_if<
is_same<typename iterator_traits<I>::value_type, string>
>::type
function(...
我不認為有什么比你想要的簡單。 理想情況下,你可以做一些類似的事情
void dumpStrings(AbstractIterator<string> beg, AbstractIterator<string> end) { }
但是STL迭代器似乎沒有任何繼承層次結構,令人惱火。 所以看起來你仍然堅持使用函數模板 - 這就是在STL算法庫中完成的 。
對不起 - 我希望有一個更好的方法,但這必須要做。 只記得在頭文件中聲明完整的函數模板!
請試試這個,這適用於所有容器:
template<class T>
void disp(T &t)
{
for( auto itr=t.begin();itr!=t.end();itr++)
cout<<*itr<<endl;
}
.cpp
vector<int> v(3,77);
list<string> l(5,"Hello");
disp(l)
disp(v);
注意:不要忘記包含< string >,
而auto在c ++ 11中可用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.