Я бы сказал, просто создайте std::map
, который отображает enum
на заводскую функцию (boost::function<>
).Затем вы просто добавляете одну запись для каждого типа, который вам нужен, с соответствующим enum
.На самом деле построить фабричные функции.Вы можете иметь некоторую функцию static Create()
для каждого класса и сохранить указатель на функцию.Или вы можете использовать Boost.Lambda конструктор / деструктор функторы.Или вы можете использовать Boost.Bind для создания функторов, которые оборачивают фабричную функцию, для которой требуется некоторое количество параметров.Вот пример:
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/lambda/construct.hpp>
#include <map>
struct Base { };
struct Derived1 : public Base { };
struct Derived2 : public Base {
static Base* Create() { return new Derived2; };
};
struct Derived3 : public Base {
int value;
Derived3(int aValue) : value(aValue) { };
static Base* Create(int aValue) { return new Derived3(aValue); };
};
enum DerivedCreate { ClassDerived1, ClassDerived2, ClassDerived3 };
int main() {
std::map< DerivedCreate, boost::function< Base*() > constructor_map;
constructor_map[ClassDerived1] = boost::lambda::new_ptr<Derived1>();
constructor_map[ClassDerived2] = &Derived2::Create;
constructor_map[ClassDerived3] = boost::bind(&Derived3::Create, 42);
//now you can call any constructor as so:
Base* ptr = constructor_map[ClassDerived2]();
};
Возможно, я допустил некоторые небольшие синтаксические ошибки, но в основном вы должны быть в состоянии заставить вышеописанную работу.Кроме того, тот факт, что у вас есть несколько шаблонов классов, не играет никакой роли, поскольку они создаются для конкретного класса (например, Class<int>
или Class<double>
), они похожи на любой другой класс, и приведенная выше идея должна оставаться действительной.*