【发布时间】:2017-06-13 14:36:03
【问题描述】:
我找不到一种方法可以将以下模板变成只有一个具有相同效果的模板。我的目标是实例化表单的子类。子类可以有没有到两个参数的构造函数。
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。
谢谢
【问题讨论】:
-
3 个重载有什么问题?
(U parameter1 = NULL, V parameter2 = NULL)看起来很丑恕我直言。NULL只能用于指针类型。如果它们不是指针NULL没有多大意义,即使它确实可以编译。请记住,您始终可以从较少参数的函数中调用较多的参数函数,以避免代码重复。 -
当然,在 C++(即当前标准)中,人们会使用可变参数模板。所以对于任何使用 C++11 及更高版本的人来说,这确实不是问题。
-
3 个重载很好,但我担心以后会出现更多。在这种情况下,参数确实是指针。我想我至少会坚持我的解决方案,直到我可以访问 C++11。谢谢
标签: c++ templates optional-parameters c++03