gpt4 book ai didi

c++ - 具有不同参数的模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:13 26 4
gpt4 key购买 nike

我找不到一种方法可以将以下模板变成只有一个具有相同效果的模板。我的目标是实例化一个 Form 的子类。子类可以有没有到两个参数的构造函数。

template<class T> bool Session::OpenForm() {
Form* form = new T();
return OpenForm(form);
}

template<class T, class U> bool Session::OpenForm(U parameter) {
Form* form = new T(parameter);
return OpenForm(form);
}

template<class T, class U, class V> bool Session::OpenForm(U parameter1, V parameter2) {
Form* form = new T(parameter1, parameter2);
return OpenForm(form);
}

我像这样使用这些模板:

session->OpenForm<SubForm>();
session->OpenForm<OtherSubForm>("Title");

环顾四周,我认为使用可选参数可以解决问题,但我无法让它发挥作用。我试过这样的事情:

template<class T, class U = T, class V = T> 
bool Session::OpenForm(U parameter1 = NULL, V parameter2 = NULL) {
Form* form = NULL;

if(parameter2 != NULL) form = new T(parameter1, parameter2);
else if(parameter1 != NULL) form = new T(parameter1);
else form = new T();
}

有没有办法只用一个模板来处理这个问题?或者也许只是更好的方法?

我使用 C++03。

谢谢

最佳答案

我将从技术上回答您的问题,但不会解决问题的关键——您真正想要的是可变参数模板,这是 C++11 的一项功能。

相反,您可以将所有工作都放在每个额外的 SubForm 类型的实现者身上:每个新的 SubForm 类都必须有一个构造函数,该构造函数接受一个 args 结构,SubForm 可以使用该结构来初始化自己。

例如:

struct SubFormArgs{};
struct OtherSubFormArgs{
OtherSubFormArgs(std::string s) : param1(s){}
std::string param1;
};

struct Form{};

struct SubForm : Form{
SubForm(SubFormArgs){}
};

struct OtherSubForm : Form{
OtherSubForm(OtherSubFormArgs args): myStr(args.param1){}
std::string myStr;
}

SubForm 使用SubFormArgs 构造自身,OtherSubForm 使用OtherSubFormArgs 构造自身。

这简化了您的 OpenForm 函数,如下所示:

bool OpenForm(Form* f){/*...*/}

struct Session
{
template<class T, class U>
bool OpenForm(U ctor_params)
{
Form* form = new T(ctor_params);
return ::OpenForm(form);
}
};

还有一个测试:

Session* session = new Session();
session->OpenForm<SubForm>(SubFormArgs());
session->OpenForm<OtherSubForm>(OtherSubFormArgs("Title"));

Demo

关于c++ - 具有不同参数的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44524566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com