Есть такой код:
#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
, однако я хочу только изменить поведение operator*
для итератора:
T& operator*(){
// do some additional function
// normal behavior, return value of some element in vector
??
}
Как я могу использовать std::vector
и его итератор с модификацией только operator*
? Я хотел бы также обернуть функции, такие как begin()
и end()
для итератора, как правильно обернуть их?
EDIT:
Используя подсказки из ответов в этой теме, мне удалось решить мою проблему следующим образом:
#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;
}
Может быть, это кому-нибудь пригодится.