C++中如何传递不定参数

chenyu2202863 2009-10-18 02:54:18
首先,不使用C函数里“...”的方式,如printf的实现模式。

其次,我希望能传递的参数个数和类型都不确定。比如,我又三个类A、B、C,它们都有一个方法Create,但是Create里的参数不同。现在我想用一个泛型的管理类来生成A、B、C对象,而这个泛型类只提供一个接口CreateObject。

现在,我只需要通过客户端在调用CreateObject时提供的参数进行判断而调用A、B、C的Create方法。类似如下代码:

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(/**/);
}
}


如果不能实现,权作讨论。
目前我知道可以有这种方法Func(vector<boost::any>),但是会有一个很大的麻烦,就是取值。
VS2010里好像提供了template<typename T,...>的方式,没研究过~

...全文
1300 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2009-10-19
  • 打赏
  • 举报
回复
在所谓的C++0x提供的不定模板参数语法之前,你只有参考loki或者boost的functor的做法:
重载从0参到15参的版本。
不要在factory模式上试图尽善尽美。
chenyu2202863 2009-10-19
  • 打赏
  • 举报
回复
期待有人来讲课
chenyu2202863 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 taodm 的回复:]
在所谓的C++0x提供的不定模板参数语法之前,你只有参考loki或者boost的functor的做法:
重载从0参到15参的版本。
不要在factory模式上试图尽善尽美。
[/Quote]

确实是这样
lzx258 2009-10-18
  • 打赏
  • 举报
回复
mmmmmmmmmmmm
CodeSpy 2009-10-18
  • 打赏
  • 举报
回复
修改C++语法,写个预处理程序将其翻译成标准C++。
chenyu2202863 2009-10-18
  • 打赏
  • 举报
回复
范型~ 范型

不用抽象工厂和方法工厂。
我想一个工厂就可以解决所有的产品
ForestDB 2009-10-18
  • 打赏
  • 举报
回复
使用设计模式。
jackyjkchen 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 loaden 的回复:]
#include <stdarg.h>
再使用
va_list ap;
va_start(ap, format);
va_end
不知道能否满足要求。
关注。

[/Quote]

这其实就是printf的方式,printf.c里就这么用
老邓 2009-10-18
  • 打赏
  • 举报
回复
#include <stdarg.h>
再使用
va_list ap;
va_start(ap, format);
va_end
不知道能否满足要求。
关注。
chenyu2202863 2009-10-18
  • 打赏
  • 举报
回复
其实,0.1.7版本的Loki里的Object Factory已经提供了变参数的Create策略。
但是却在指定Factory模板参数的时候还是需要参数类型及个数~
比如下面的代码

// 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;
}


chenyu2202863 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 garfield 的回复:]
参数干脆用xml或者json传进去好了
然后在create里面按照各个class的参数需求get出来
如果bad_cast了就return NULL。

create(" <create clsid=123456_1234_1234_12345678> <param type=string>hello </param> <param type=integer>100 </param> </create>")

[/Quote]

这个方法看上去很前卫~不知道具体细节如何~
感觉很动态~
Garfield 2009-10-18
  • 打赏
  • 举报
回复
参数干脆用xml或者json传进去好了
然后在create里面按照各个class的参数需求get出来
如果bad_cast了就return NULL。

create("<create clsid=123456_1234_1234_12345678><param type=string>hello</param><param type=integer>100</param></create>")
problc 2009-10-18
  • 打赏
  • 举报
回复
我也想知道怎么实现。
jackyjkchen 2009-10-18
  • 打赏
  • 举报
回复
我只会printf的实现方式……
chenyu2202863 2009-10-18
  • 打赏
  • 举报
回复
我希望是泛型的
chenyu2202863 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]
void function(void* pClass, int nClassSize)
{

}

传指针,然后强制转换,判断类型。
[/Quote]

你这个和...没本质区别吧,我希望做到类型安全
pcboyxhy 2009-10-18
  • 打赏
  • 举报
回复
这种情况应该从创建型模式中找一个用
Garfield 2009-10-18
  • 打赏
  • 举报
回复
噢 工厂模式
wuyu637 2009-10-18
  • 打赏
  • 举报
回复
void function(void* pClass, int nClassSize)
{

}

传指针,然后强制转换,判断类型。

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧