У меня есть 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. Общий указатель предназначен только для того, чтобы внутренне не копировать что-либо при обработке. Подойдет любой метод, который позволяет это сделать, но не копирует объект более одного раза.