所以我想为指针编写一个容器,它隐藏了它是指针容器的事实。对于我的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容器,因为这将是一个非拥有容器。
答案 0 :(得分:3)
现在,是否有可能以基于范围的for循环获取值语义的方式实现begin()和end()?
是。就像每个其他容器一样,您需要提供返回迭代器的begin
和end
。
您不能直接使用std::vector<T*>::iterator
,因为它的值类型错误,但您可以在其上实现迭代器。这种包装器迭代器称为迭代器适配器。
幸运的是,boost已经包含了一个迭代器适配器库,因此您无需从头开始实现。您可能希望特别关注boost::indirect_iterator
。
PS。避免公开继承标准容器。它们没有虚拟析构函数,因此很容易错误地编写具有未定义行为的程序。