我遇到的问题如下:我有一个对象的继承层次结构,并且我想定义一个类,该类表示该层次结构中对象的集合,这些对象可以具有不同的动态类型。我想知道是否有一种方法可以对这样的集合进行制作和迭代,同时隐藏它包含指针的事实。目前,我的代码可以总结如下:
class Base{
public:
virtual Base* clone() const & { return new Base(*this); }
virtual Base* clone() && { return new Base( std::move(*this) ); }
... other members ...
};
class Derived : public Base{
public:
Derived* clone() const & override { return new Derived(*this); }
Derived* clone() && override { return new Derived( std::move(*this) ); }
... other members ...
};
class ObjectCollection{
public:
... constructor and other members...
// use 'clone' function to initialize the collection without having to pass pointers
void push_back( const Base& );
void push_back( Base&& );
using iterator = std::vector< std::shared_ptr< Base > >::iterator
using const_iterator = std::vector< std::shared_ptr< Base > >::const_iterator
iterator begin(){ return collection.begin(); }
const_iterator begin() const{ return collection.cbegin(); }
iterator end() { return collection.end(); }
const_iterator end() const{ return collection.cend(); }
private:
std::vector< std::shared_ptr< Base > > collection;
};
//loop over objects:
ObjectCollection collection(...call to constructor...);
for( auto & object : collection ){
//object is now a reference to shared_ptr to Object rather than a reference to Object!
}
理想情况下,我希望能够像上一个一样编写一个for循环,在该循环中,我可以直接获取对对象的引用,而不是指针。有没有办法做到这一点?还是继续使用指针会更好? (注意:我知道解决该问题的一种方法,但是我想避免的方法是重载[]运算符以取消对指针的引用。)
答案 0 :(得分:0)
使用range-v3,您可以创建shared_ptr
集合的参考视图:
auto get_collection_view() /*const*/
{
return collection | ranges::v3::transform([](auto&& p) -> /*const*/ Base& { return *p; });
}