Вот такой код:
#include <iostream>
#include <vector>
template <class T>
class A{
public:
class iterator : public std::vector<T>::iterator{
public:
T& operator*(){
??
}
};
iterator begin(){
return v.begin(); // error
}
iterator end(){
return v.end(); // error
}
void add(const T& elem){
v.push_back(elem);
}
private:
std::vector<T> v;
};
int main() {
A<int> a;
a.add(2);
a.add(4);
for(A<int>::iterator it = a.begin(); it != a.end(); ++it){
std::cout << *it << std::endl;
}
return 0;
}
Это оболочка для std :: vector
с моими собственными дополнительными функциями. Я хотел бы использовать итератор std :: vector
, однако я хочу изменить только поведение оператора *
для итератора:
T& operator*(){
// do some additional function
// normal behavior, return value of some element in vector
??
}
Как я могу использовать std: : вектор
и его итератор с модификацией только оператора *
? Я также хотел бы обернуть такие функции, как begin ()
и end ()
для итератора, как правильно их обернуть?
РЕДАКТИРОВАТЬ:
Используя советы из ответов в этом в теме, свою проблему мне удалось решить следующим образом:
#include <iostream>
#include <vector>
template <class T>
class A {
public:
class iterator : public std::vector<T>::iterator {
public:
iterator(typename std::vector<T>::iterator c) : std::vector<T>::iterator(c) {
}
T& operator*() {
std::cout << "Im overloaded operator*\n";
return std::vector<T>::iterator::operator *();
}
};
iterator begin() {
return iterator(v.begin());
}
iterator end() {
return iterator(v.end());
}
void add(const T& elem) {
v.push_back(elem);
}
private:
std::vector<T> v;
};
int main() {
A<int> a;
a.add(2);
a.add(4);
for (A<int>::iterator it = a.begin(); it != a.end() ; ++it) {
std::cout << *it << std::endl;
}
return 0;
}
Может быть, кому-то это будет полезно.