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

Value semantics in range based for loop of pointer container

本文关键字:循环 范围内 语义 于指针 指针      更新时间:2023-10-16

,所以我想为指针写一个容器,以隐藏它是一个指针容器的事实。对于我的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;
}

现在,是否有可能以基于范围的循环获得值语义的方式实现begin()end()?IE。只有member为您提供价值吗?我不想使用Boost PTR容器,因为这将是一个非拥有容器。

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

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

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

幸运的是,Boost已经包含了迭代器适配器的库,因此您无需从头开始实现。您可能需要特别看boost::indirect_iterator


ps。避免公开继承标准容器。他们没有虚拟破坏者,因此很容易错误地编写具有未定义行为的程序。