Передача вектора умных указателей производных объектов - какое лучшее решение? - PullRequest
0 голосов
/ 16 января 2019

Я использую интеллектуальные указатели двух классов

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 голосов
/ 16 января 2019

Просто используйте перегрузку конструктора std::vector, для которой требуется два итератора, для создания временного:

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

Вы также можете объявить перегрузку Method(), которая для удобства берет вектор производных указателей и просто делает это. Это предотвратит некоторое раздувание кода, когда это делается часто.

...