Явно передавая вектор shared_ptr в функцию - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть Base и несколько классов Derived, которые определяют общий метод foo. foo определяется с определением в Базовом классе и является виртуальным. Derived объекты могут вызывать Base::foo() в своих собственных foo методах, если они sh. Каждый класс Derived имеет свой собственный набор параметров конструктора, отличный от класса Base.

Я знаю, что терминология - это шутка, но когда я говорю, что каждый производный класс, я имею в виду, что существуют определения классов, такие как class Parrot: public Base и class Dog: public Base.

У меня есть следующий метод

void addImportantObjects(std::vector<std::shared_ptr<Base>> objects);

, который в конечном итоге сохранит каждый из этих общих указателей в различных внутренних векторах, чтобы он мог выполнять их итерацию и вызывать foo и иметь правильный foo класса Derived.

Я собираюсь часто вызывать этот метод, и я хочу, чтобы он был маленьким / функциональным и легким для чтения, насколько это возможно. Очевидно, что было бы неплохо скрыть конструкцию вектора или приведение указателей, если это возможно.

Это лучшее, что я смог сделать на данный момент

std::vector<std::shared_ptr<Base>> objs;
objs.push_back(std::dynamic_pointer_cast<Base>(std::make_shared<Derived>(args)));
objs.push_back(std::dynamic_pointer_cast<Base>(std::make_shared<Derived2>(args)));
addImportantObjects(objs);

Вы можете видеть много места тратится впустую на приведение и push_backs и синтаксис общего указателя. Если бы у меня был длинный список объектов, которые я хотел бы добавить, это было бы много кода.

Мой вопрос, есть ли способ, чтобы я выглядела ближе к, возможно,

addImportantObjects({Derived(args), Derived2(args)})

В случае, если здесь важно, чтобы на эти объекты не ссылались вне области объекта с помощью метода addImportantObjects. Общий указатель предназначен только для того, чтобы внутренне не копировать что-либо при обработке. Подойдет любой метод, который позволяет это сделать, но не копирует объект более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...