64,666
社区成员
发帖
与我相关
我的任务
分享
template<typename T>
struct CreateControl
{
T *Create()
{
//...
}
}
template<>
struct CreateControl<A>
{
A *Create(int var1, int var2)
{
//...
}
}
template<>
struct CreateControl<B>
{
B *Create(int var1, char var2, string var3)
{
//...
}
}
template<>
struct CreateControl<C>
{
C *Create(void)
{
//...
}
}
template<typename T, template<typename> class TCreatePolicy = CreateControl>
class ControlManagerT
: public TCreatePolicy<T>
{
public:
T *Create(/*这里就需要我所需求的*/)
{
return TCreatePolicy<T>::Create(/**/);
}
}
// ObjectFactory.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <loki/Factory.h>
#include <loki/Singleton.h>
#include <vld.h>
// 窗体基类
struct IWidget
{
virtual void printName() = 0;
virtual ~IWidget(){;}
};
// 定义窗体工厂,使用string区分各对象类型
typedef Loki::Factory<IWidget, std::string> widget_factory_t;
//typedef Loki::Factory<IWidget, std::string, Loki::Seq<int, int> > widget_factory_t;
// 按钮窗体
struct CButton :public IWidget
{
CButton *Create()
{
return new CButton;
}
void printName()
{
std::cout << "CButton" << std::endl;
}
};
// 编辑框窗体
struct CEdit :public IWidget
{
CEdit *Create(int i, int j)
{
return new CEdit;
}
void printName()
{
std::cout << "CEdit" << std::endl;
}
};
// 列表框窗体
struct CListBox :public IWidget
{
CListBox *Create(int i, int j, char c)
{
return new CListBox;
}
void printName()
{
std::cout << "CListBox" << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
// 工厂实例
widget_factory_t wf;
// 注册各种窗体的生成器,这里偷懒用了CreateUsingNew作为生成器
wf.Register("Edit", Loki::CreateUsingNew<CEdit>::Create );
wf.Register("Button", Loki::CreateUsingNew<CButton>::Create );
wf.Register("ListBox", Loki::CreateUsingNew<CListBox>::Create );
/*wf.Register("Edit", &CButton::Create );
wf.Register("Button", &CEdit::Create );
wf.Register("ListBox", &CListBox::Create );*/
// 测试,使用工厂生成窗体
{
IWidget* pWid = wf.CreateObject("Edit");
pWid->printName();
delete pWid;
}
{
IWidget* pWid = wf.CreateObject("ListBox");
pWid->printName();
delete pWid;
}
system("pause");
return 0;
}