包含不同参数的模板

时间:2017-06-13 14:36:03

标签: c++ templates optional-parameters c++03

我找不到将以下模板转换为具有相同效果的模板的方法。我的目标是实现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。

由于

1 个答案:

答案 0 :(得分:1)

我将在技术上回答你的问题,但不解决它的症结 - 你真正想要的是可变参数模板,这是一个C ++ 11特性。

相反,您可以将所有工作放在每个附加SubForm类型的实现者上:每个新的SubForm类必须具有一个构造函数,该构造函数接受一个 args 结构,SubForm可以使用它来初始化自身。< / p>

例如:

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"));

测试:

toAnyObject()

Demo