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

标签 c++ boost parameter-passing

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

class Foo{
};

class Derived : public Foo{
};

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

我将对象的 vector 保存为

std::vector<DerivedPtr> myVec;

我想在请求基类智能指针 vector 的方法中使用它。

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

直接使用vector,编译会报错。

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

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

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

Method( downCastVec );

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

有没有更好/更优雅的方法来处理这个问题?

最佳答案

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

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

为了方便起见,您还可以声明一个采用派生指针 vector 的 Method() 重载,并且只执行此操作。当经常这样做时,这将防止一些代码膨胀。

关于c++ - 传递派生对象的智能指针 vector - 什么是最佳解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54216877/

相关文章:

c++ - boost memory_order_consume 示例

c++ - std::set with std::pair - 如何为元素编写比较器

c++ - C++ 控制台中基于实时的递增/递减

c++ - 如何在 Boost Graph Library 中进行 BFS 时修改属性?

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

c++ - 将变量从 C++ 传递到 Matlab(工作区)

c - GCC 是否为传递给函数的数组创建 typedef?

c++ - 作为类成员管理指针 vector

C++:嵌套映射