Немного глупый пример, но вот несколько примеров использования шаблонов и decltype вывести тип итераторов:
#include <vector>
#include <iostream>
using std::vector;
using std::cout;
template <class T> void double_vals(T vbeg, T vend)
{
for (; vbeg != vend; ++vbeg)
*vbeg *= 2;
}
template <class T, class T2> auto find_val(T vbeg, T vend, T2 val) -> decltype(vbeg)
{
for (; vbeg != vend; ++vbeg)
if (*vbeg == val) return vbeg;
return vbeg;
}
int main()
{
vector<int> vec = {10, 20, 30};
auto it1 = vec.begin();
auto it2 = vec.end();
double_vals(it1, it2);
auto it3 = find_val(it1, it2, 20);
if (it3 != vec.end())
cout << "Found value!\n";
for (auto i : vec)
{
cout << i << '\n';
}
return 0;
}
// Note that you could avoid using decltype() here by doing
template <class T, class T2> T find_val(T vbeg, T vend, T2 val)
{
for (; vbeg != vend; ++vbeg)
if (*vbeg == val) return vbeg;
return vbeg;
}
Если вы читали какой-либо предварительной C++ 11 учебника, вы увидите множество мест, где итераторы объявлены, особенно в циклах 'for'. Объявление итератора цикла или аргумента/функции функции итератора функции не имеет значения, все равно делается так же. –
Чтение [хорошая ссылка] (http://en.cppreference.com/w/cpp/container/vector) также должно помочь. –
В качестве альтернативы, сделайте как можно около любой [стандартной функции алгоритма] (http://en.cppreference.com/w/cpp/algorithm) и используйте шаблоны. –