包装STL向量并更改其迭代器的行为

scd*_*dmb 6 c++ 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;
} 
Run Code Online (Sandbox Code Playgroud)

这是std::vector我自己的附加功能的包装.我想使用std::vector的迭代器,但我只想改变operator*迭代器的行为:

T& operator*(){
  // do some additional function
  // normal behavior, return value of some element in vector
            ??
}
Run Code Online (Sandbox Code Playgroud)

我如何使用std::vector和它的迭代器只修改operator*?我还想包装函数begin()end()for迭代器,如何正确包装它们?

编辑:

使用本主题中的答案提示,我设法通过以下方式解决了我的问题:

#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;
} 
Run Code Online (Sandbox Code Playgroud)

也许这对某人有帮助.

pmr*_*pmr 3

包装 stdlib 迭代器最好使用迭代器适配器。这项任务绝非微不足道,Boost.Iterator库可以简化该任务。也许提供的迭代器之一已经解决了您的问题。

如果您打算自己编写这个(我真的不推荐这样做),您应该实现自己的迭代器并使其可以从 a 构造vector::iterator,然后重载所有必需的运算符以满足新迭代器概念的要求楷模。也继承自std::iterator以使特征发挥作用。不要忘记有一个 const 变体。本书有一章专门讨论开发自己的迭代器。还可以获得标准的副本(C++03 或 C++11,在这里并不重要)。你将会需要它。