具有不同参数的模板
Templates with different parameters
我找不到办法将以下模板变成只有一个具有相同效果的模板。我的目标是实例化一个 Form 的子类。子类可以有带 none 两个参数的构造函数。
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 class 必须有一个接受 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"));
我找不到办法将以下模板变成只有一个具有相同效果的模板。我的目标是实例化一个 Form 的子类。子类可以有带 none 两个参数的构造函数。
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 class 必须有一个接受 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"));