【问题标题】:C++ Alternative to a template class in a Qt plugin interfaceC++ 替代 Qt 插件接口中的模板类
【发布时间】:2011-07-08 03:11:08
【问题描述】:

我在编译带有通用成员函数和变量的 qt 插件时遇到问题。这个想法是:我有一个插件 A1,它使用未指定类型 T(其他接口)的其他插件。 A1 实现接口(抽象类)A。在 A 中我需要一个传递其他插件的函数。

看起来像这样:

template <typename T>
class A {
public:
  void setPlugins(QList<T*>* plugins)
  {
    plugins_ = plugins;
  }
private:
  QList<T*>* plugins_;
};

我希望我已经正确理解了模板,但我认为这应该正常工作。现在的问题是,似乎不可能将插件接口 (A) 定义为具有 Qt 插件概念的模板类。有没有其他方法可以做我想做的事?


编辑: 我更喜欢没有 RTTI 的解决方案。

【问题讨论】:

    标签: c++ qt templates plugins interface


    【解决方案1】:

    我会尽量回答...

    在 Qt 中,每个插件类都应该继承自 QObject。
    因此,您可以删除模板并使用指向 QObjects 的指针列表来存储插件:

    QList<QObject*> plugins_;  
    

    然而在这种情况下,当您需要使用列表中的特定插件作为插件时,您将丢失类型信息并且需要以某种方式从 QObject 指针推断插件的类型。
    QObject 是一种多态类型,因此您可以在需要时使用 dynamic_cast 来确定确切插件的类型。希望这会有所帮助。

    【讨论】:

    • ...如果你不使用-fno-rtti
    • 这个想法很好,应该可以工作,但是:要设置的插件的接口继承不是 QObject,只有它们的实现。这意味着我必须将调用者的列表声明为 QObject* 列表,这不太好处理,尤其是在取消此列表以放入加载的插件时(就像我现在所做的那样)。但也许这是唯一的可能性。
    • @Mike DeSimone:你是对的。也许有人知道没有 RTTI 的解决方案?
    • @FunkyClaude 如果您编写自己的插件包装器,它会为您效劳吗?
    【解决方案2】:

    一个问题是 A 不是一个类,而是一个类的模板。您可能必须为您的界面使用具体的 A

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多