Обернуть вектор STL и изменить поведение его итератора

Вот такой код:

#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;
} 

Может быть, кому-то это будет полезно.

6
задан scdmb 20 October 2011 в 15:22
поделиться