我正在使用两个类的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 );
这可行,但是我的实际问题是:
是否有更好/更优雅的方式来解决此问题?
答案 0 :(得分:4)
只需使用需要两个迭代器的std::vector
构造函数重载来构造一个临时对象:
Method( {myVec.begin(), myVec.end()} )
为了方便起见,您也可以声明Method()
的重载,该重载采用派生指针的向量,并做到了这一点。这样可以防止某些频繁执行的代码膨胀。