Также возможно создавать экземпляры динамически. Вдохновляющий, но неполный код:
class TypeProxy {
public:
virtual ~TypeProxy() = default;
char* create_default() const { return this->create_default_impl(); }
template <typename T>
static scoped_ptr<TypeProxy> CreateProxy ();
private:
virtual void* create_default_impl() const = 0;
};
// A creator class.
template <typename T>
class Concrete : public TypeProxy {
void *create_default_impl() const {
return new T ();
}
};
// Method to create creator proxies.
template <typename T>
scoped_ptr<TypeProxy> TypeProxy::CreateProxy () {
return scoped_ptr<TypeProxy> (new Concrete<T>());
}
Обратите внимание, что это всего лишь некоторый непроверенный рабочий код, показывающий рабочий режим. Использование scoped_ptr
является дискуссионным.
Вы можете получить больше фантазии с помощью шаблонов с переменным числом аргументов (см., Например, функции emplace[_(front|back)]
в C ++ 11), но это станет сложным, поскольку шаблоны виртуальных функций недопустимы, но вам все равно придется каким-то образом передавать списки аргументов.
(sidenote: boost::shared_ptr
использовать аналогичное сочетание виртуальных / шаблонов, поэтому вы можете использовать с ним неполиморфные базовые классы и пользовательские средства удаления)