c++ - 通过 parent() 进行 qobject_cast 的可变参数模板

标签 c++ qt templates c++11 variadic-templates

大师和模板专家,我需要你们的帮助...

我目前正在寻找一种检查 QObject 父层次结构的解决方案。我有一个具有以下层次结构(父到子)的自定义 QDialog:

QDockWidget
> CustomDockArea
  > QMainWindow
    > QDockWidget
      > CustomDialog

在 CustomDialog 类中,我想检查对话框的层次结构是否与此示例匹配,因此我检查了这是否可以使用可变参数模板完成,例如:

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;
    }
}

但是,存在一些问题:我需要参数包的最后一个参数作为函数的返回类型,在我们的示例 QDockWidget* 中。我可以将第一个参数作为返回类型,但这会使模板调用有点麻烦。然而,即使这个问题得到解决,我认为参数包“展开”的方式仍然存在问题,现在我有点不确定我的模板方法对于原始问题是否可行。也许你可以给我一些提示。提前致谢!!!

最佳答案

使用 c++14,您可以简单地使用 auto 作为返回类型:

template <class T>
T* qobject_cast_parent(QObject* root)
{
    return root
        ? qobject_cast<T*>(root->parent())
        : nullptr;
}

template <class T, class T2, class... Ts>
auto qobject_cast_parent(QObject* root)
//-> typename Last<T2, Ts...>::type /* In c++11, you have to create this traits */
{
    return root
        ? qobject_cast_parent<T2, Ts...>(qobject_cast<T*>(root->parent()))
        : nullptr;
}

关于c++ - 通过 parent() 进行 qobject_cast 的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35700524/

相关文章:

c++ - std::functions 是否由 C++11 编译器内联?

c++ - 两次递归调用的递归算法的时间复杂度

c++ - 是否可以将每个 if-else 结构替换为等效的条件表达式?

c++ - Qt 框架 : How to display a QGraphicsView in a layout?

qt - Q流程问题,流程输出

c++ - 如何将函数应用于数组中的所有元素(在 C++ 模板类中)

c++ - 以 STL 样式创建类的模板化方法

c++ - 为什么 QFileDialog::getOpenFileName 不起作用?

c++ - 带有引用参数的模板结构构造器

templates - 部分变量不可见