传递派生对象的智能指针矢量-最佳解决方案是什么?

时间:2019-01-16 12:14:43

标签: c++ boost parameter-passing

我正在使用两个类的boost智能指针

class Foo{
};

class Derived : public Foo{
};

typedef boost::shared_ptr<Foo> FooPtr;
typedef boost::shared_ptr<Derived> DerivedPtr;

我将对象的向量保持为

std::vector<DerivedPtr> myVec;
我想在请求基类智能指针向量的方法中使用

Method( std::vector<FooPtr> input ){
... }

直接使用向量,编译时会出错。

  

cannot convert argument 1 from 'std::vector<DerivedPtr,std::allocator<_Ty>>' to 'std::vector<FooPtr, std::allocator<_Ty>>'

所以我当前的解决方案是先将向量向量“下铸”为基类指针的新向量,然后再传递给它:

std::vector<FooPtr> downCastVec;
for ( auto & iter : myVec )
    downCastVec.push_back( iter );

Method( downCastVec );

这可行,但是我的实际问题是:

是否有更好/更优雅的方式来解决此问题?

1 个答案:

答案 0 :(得分:4)

只需使用需要两个迭代器的std::vector构造函数重载来构造一个临时对象:

 Method( {myVec.begin(), myVec.end()} )

为了方便起见,您也可以声明Method()的重载,该重载采用派生指针的向量,并做到了这一点。这样可以防止某些频繁执行的代码膨胀。