基于指针容器循环的范围内的值语义

时间:2017-02-14 17:04:54

标签: c++ pointers for-loop containers

所以我想为指针编写一个容器,它隐藏了它是指针容器的事实。对于我的AddMember函数,这是有效的。

#include <iostream>
#include <vector>

template<typename T>
class MyVector : public std::vector<T*>
{
public:
    void AddMember(T& newMember)
    {
        this->push_back(&newMember);
    }
};

int main()
{
    int a, b;
    MyVector<int> vec;
    vec.AddMember(a);
    vec.AddMember(b);

    for (auto& member : vec)
    {
        std::cout << "Address:" << member << " Value: " << *member << std::endl;
    }

    return 0;
}

现在,是否有可能以基于范围的for循环获取值语义的方式实现begin()end()?即只是member给你的价值?我不想使用boost ptr容器,因为这将是一个非拥有容器。

1 个答案:

答案 0 :(得分:3)

  

现在,是否有可能以基于范围的for循环获取值语义的方式实现begin()和end()?

是。就像每个其他容器一样,您需要提供返回迭代器的beginend

您不能直接使用std::vector<T*>::iterator,因为它的值类型错误,但您可以在其上实现迭代器。这种包装器迭代器称为迭代器适配器。

幸运的是,boost已经包含了一个迭代器适配器库,因此您无需从头开始实现。您可能希望特别关注boost::indirect_iterator

PS。避免公开继承标准容器。它们没有虚拟析构函数,因此很容易错误地编写具有未定义行为的程序。