Абстрактная фабрика C ++ с использованием шаблонов

Я пытаюсь создать абстрактный шаблон фабрики для нескольких абстрактных фабрик на C ++ и придумал это.

#define _CRTDBG_MAP_ALLOC
#include 
#include 
#include 

class Base
{
public:
    virtual ~Base() {}

    virtual bool Get() = 0;
};

class DerivedA : public Base
{
public:
    bool Get()
    {
        return true;
    }
};

class DerivedB : public Base
{
public:
    bool Get()
    {
        return false;
    }
};

template 
class Creator
{
public:
    virtual ~Creator(){}
    virtual T* Create() = 0;
};

template 
class DerivedCreator : public Creator
{
public:
    T* Create()
    {
        return new T;
    }
};

template 
class Factory
{
public:
    void Register(Key Id, Creator* Fn)
    {
        FunctionMap[Id] = Fn;
    }

    T* Create(Key Id)
    {
        return FunctionMap[Id]->Create();
    }

    ~Factory()
    {
        std::map*>::iterator i = FunctionMap.begin();
        while (i != FunctionMap.end())
        {
            delete (*i).second;
            ++i;
        }
    }
private:
    std::map*> FunctionMap;
};

int main(int argc, char** argv[])
{
    _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);

    //Register
    Factory temp;
    temp.Register("DA", (Creator*)new DerivedCreator);
    temp.Register("DB", (Creator*)new DerivedCreator);

    //Pointer to base interface
    Base* pBase = 0;

    //Create and call
    pBase = temp.Create("DA");
    printf("DerivedA %u\n", pBase->Get());
    delete pBase;

    //Create and call
    pBase = temp.Create("DB");
    printf("DerivedB %u\n", pBase->Get());
    delete pBase;

 return 0;
}

Он компилируется и работает нормально без утечек памяти (win32 crtdbg), но я не Не знаю, действительно ли это правильный способ создания абстрактного фабричного шаблона.

temp.Register("DA", (Creator*)new DerivedCreator);

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

Этот код действительно работает нормально, как показано выше, и даже удаляет без утечек памяти. Мне просто это не совсем удобно.

Мне не удалось найти никаких реальных примеров классов шаблонов, кроме этого из MaNGOS (вау-эмулятор) - https: //mangos.svn.sourceforge . net / svnroot / mangos / trunk / src / framework / Dynamic / ObjectRegistry.h

Но я не думаю, что могу использовать этот метод в моем проекте, потому что я планирую использовать библиотеки DLL в какой-то момент своего проекта, и он использует CRTP что противоречит моим требованиям к полиморфизму времени выполнения.

12
задан NtscCobalt 5 December 2010 в 05:18
поделиться