2011-01-24 2 views
0

В настоящее время я пытаюсь разработать общий Abstract Factory и имеют следующий класс дизайн набросал:C++ Generic Abstract Factory Design Вопрос

template <typename T> 
class TFactory 
{ 
    public: 
     template <typename A> 
     static T* create(A a); 

     template <typename A, typename B> 
     static T* create(A a, B b); 

     template <typename A, typename B, typename C> 
     static T* create(A a, B b, C c); 

     static T* destory(T* ptr); 
}; 

завод затем можно использовать в качестве так:

Factory<MyType>::create(1, "hello"); 
Factory<MyType>::create<short, const std::string&>(1, "hello"); 

Есть ли лучший способ разработать это? Это кажется лучше, чем varargs, но у меня есть перегрузка до 10 функций.

EDIT:

Я хотел бы добавить причину этого в том, что я буду использовать аллокатор заказа памяти в пределах завода.

ответ

1

Вы можете найти такую ​​работу, которая уже была выполнена в библиотеках Boost, таких как Bind и Lambda.

Here - это список выражений лямбда, которые обертывают конструкторы/деструкторы и новые/удаляют. Вы можете либо использовать их, либо вдохновляться ими писать самостоятельно.

Например, с помощью лямбда-конструктор, вы могли бы иметь следующее:

template <typename T> class TFactory { 
    public: 
     template <typename A> 
     static T* create(A a) { 
      return new a(); //where a wraps a binded constructor call. 
     }; 
}; 

Тогда вы бы использовать функцию создания следующим образом:

Factory<MyType>::create(boost::bind(boost::lambda::constructor<MyType>(),1,"hello")); 

я уверен, что вы можете найти путь чтобы сделать это лучше (возможно, с #define).

1

Без вариационных шаблонов вы не можете много сделать (кроме злоупотребления препроцессором, но я не вижу способа сделать это чисто, то есть без генераторов кода).

Посмотрите на boost::make_shared, если вы не собираетесь изобретать велосипед.

Кстати, это не абстрактная фабрика. Абстрактные фабрики являются полиморфными классами.

1

Похоже, что вы ищете Varardic Templates, который будет представлен как часть стандарта C++ 0x.