Можно ли вызвать emplace_back для размещения объекта-наследника?

Допустим существует иерархия классов - базовый base и наследующий derived, а так же вектор из base.

Я могу вызывать vector<base>::emplace_back(...) для инициализации и размещения base, но как быть с derived? Хотелось бы что-то вроде vector<base>.emplace_back<derived>(...), но такой перегрузки метода я не увидел. Возможно подобный приём выполняется как-то иначе или вовсе невозможен?

И ещё, правильно ли я понимаю, что вызывать emplace_back нужно исключительно с передачей аргументов для конструктора инициализируемого объекта? Догадываюсь, что можно сделать vector<base>.emplace_back(new derived(1,2,3)), но тогда теряется смысл в эффективной работе через perfect forwarding?

Пример кода:

class base { 
  public: base(int a) { } 
}
class derived_1 : public base { 
  public: derived(int a, int b) : base(a) { } 
}
class derived_2 : public base { 
  public: derived(int a, int b, int c) : base(a) { } 
}

/* main */
std::vector<base> vec;
vec.emplace_back(1); // ok - размещение base объекта

/* ... Хотелось бы как-то так, но такой перегрузки не нашел ... */
vec.emplace_back<derived_1>(1,2);
vec.emplace_back<derived_2>(1,2,3);

PS: пока писал вопрос в голову закралась мысль: derived нельзя размещать через emplace_back, т.к. объект размещается во внутреннем массиве и должен соответствовать объявленному типу vector?


Ответы (0 шт):