Вы можете просто сделать это в C ++ 11:
template<class T>
class A {
vector<T> arr;
public:
using iterator = typename vector<T>::iterator;
using const_iterator = typename vector<T>::const_iterator;
const_iterator begin() const { return arr.begin(); }
iterator begin() { return arr.begin(); }
const_iterator end() const { return arr.end(); }
iterator end() { return arr.end(); }
};
или в C ++ 14:
template<class T>
class A {
vector<T> arr;
public:
using iterator = typename vector<T>::iterator;
using const_iterator = typename vector<T>::const_iterator;
auto begin() const { return arr.begin(); }
auto begin() { return arr.begin(); }
auto end() const { return arr.end(); }
auto end() { return arr.end(); }
};
Тогда вы можете поддерживать итерацию на основе итератора:
A<int> a(5);
for(A<int>::iterator it = a.begin() ; it != a.end() ; it++) { /* .. */
}
И на основе диапазона для цикла:
A a(5);
for(auto v : a) { /* .. */
}
Дополнительные пояснения о том, как поддерживать циклический цикл for, доступны здесь: Как настроить мой пользовательский тип для работы с циклическим циклом?
(спасибо @JohnML за предложение отредактировать ответ, совместимый с c ++ 11!)