C ++ Общий абстрактный вопрос проектирования фабрики - PullRequest
0 голосов
/ 24 января 2011

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

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 функций.

РЕДАКТИРОВАТЬ:

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

Ответы [ 3 ]

1 голос
/ 24 января 2011

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

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

Например, используя конструктор Lambda, вы можете получить следующее:

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

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

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

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

1 голос
/ 24 января 2011

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

1 голос
/ 24 января 2011

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

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

...