Если вам действительно не нужно знать тип контейнера, я настоятельно рекомендую сохранить ваш ClassHoldingAnIteratorToAStandardContainer
независимо от типа конкретного контейнера.Если вам просто нужен итератор, это проще и достаточно:
template<typename iterator>
struct iterator_wrapper {
iterator iter;
};
Это минимум, необходимый для того, чтобы иметь итератор в качестве члена :).
Я действительно не знаю, для чего вы хотите использовать итератор, поэтому просто для примера давайте добавим методы, которые фактически используют итератор ....
#include <iterator>
#include <vector>
#include <iostream>
template<typename iterator>
struct iterator_wrapper {
using value_type = typename std::iterator_traits<iterator>::value_type;
iterator iter;
bool operator!=(const iterator& other) { return iter != other;}
iterator_wrapper& operator++(){
++iter;
return *this;
}
const value_type& operator*() { return *iter; }
};
template <typename iterator>
iterator_wrapper<iterator> wrap_iterator(iterator it) {
return {it};
}
int main() {
std::vector<int> vec{1,2,3};
auto it = wrap_iterator(vec.begin());
for (;it != vec.end();++it) std::cout << *it;
}
Также есть проблема в вашем коде.
typename StdLibContainer<Element*>::iterator
для контейнеров указателей, в то время как в основном у вас есть int
s.Если вы хотите вывести тип итератора из типа контейнера, вы можете сделать это, например, следующим образом:
template <typename container,
typename iterator = typename container::iterator>
iterator_wrapper<iterator> wrap_begin(container& c) {
return {c.begin()};
}
, что упрощает создание iterator_wrapper
, например
auto x = wrap_begin(vec);
Обратите внимание, что этот ответ относится к C ++ 11, в более новых стандартах есть руководства по выводам, которые делают такие make_x
методы более или менее излишними.