Можно ли вызвать 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?