大师和模板专家qobject_cast,我需要你的帮助......可变参数模板通过父()
我目前正在寻找在检查一个QObject的父层次的解决方案。我有一个自定义QDialog的有以下层次结构(父到子):
QDockWidget
> CustomDockArea
> QMainWindow
> QDockWidget
> CustomDialog
内CustomDialog类,我要检查,如果对话的层次结构这个例子匹配,所以我检查,如果这是accomplishable具有可变参数模板,例如:
assert(qobject_cast_parent<QDockWidget*, QMainWindow*, CustomDockArea*, QDockWidget*>(this));
,我想出了这样的事情:
template <class T, class... Ts>
inline T qobject_cast_parent(QObject* root)
{
if (root)
{
if (sizeof...(Ts) == 0)
{
return qobject_cast<T>(root->parent());
}
else
{
return qobject_cast_parent<Ts...>(root->parent());
}
}
else
{
return nullptr;
}
}
然而,有几个问题:我需要的PA的最后一个参数rameter包作为函数的返回类型,在我们的例子中是QDockWidget *。我可以将第一个参数作为返回类型,但这会使模板调用有点麻烦。但是,即使解决了这个问题,我认为参数包的“展开”方式仍然存在问题,现在我有点不确定我的模板方法对于原始问题是否可行。也许你可以给我一些提示。提前致谢!!!
“我要检查,如果层次结构是正确的。”为什么CustomDialog关心整个层次结构树?这是一个对话框,它应该可以在没有父母的情况下自行使用......当然,如果父母有正确的父母朝向树的根部,它可以*添加*功能,但是您不应该关心在哪里这些父母是。你可以简单地使用你发现的第一个和第二个'QDockWidget',但即使如此,我认为这样的接口是笨重的。也许你应该公开几个信号/插槽,并提供一个辅助方法,将它们连接到某个特定的树上。 –
“正确”一词可能会产生误导,我相应地编辑了我的答案。对话框的行为取决于它在层次结构中的位置,因此必须进行某些检查。 – CppChris
也许对话应该明确告诉做什么,从知道层次结构的代码?这将会更清洁。就像这样,你正在暴露一个API到你的对话框中,这个API没有用类的签名来表示...... –