簡體   English   中英

編譯時檢查 class 從基礎 class 繼承並用作它

[英]Compile time check that a class inherits from a base class and use as it

問題的標題不是很清楚,我會盡力解釋得更好。 我正在使用 Qt 和 windows 我正在使用從 QWidget 派生(直接或間接)。 My windows has to be treat uniformly, so that I can take a pointer to the currently active window and invoke methods on it not knowing the actual window class, for this reason all my windows derive from another class, let's call it "myScreen". 到目前為止,一切都很好。

現在我想在“myScreen”中處理 window 的隱藏和顯示,使其統一。 例如,從 window 傳遞到另一個可能意味着在當前 window 上調用“hide()”,在新 window 上調用“show()”。 由於“myScreen”和QWidget沒有任何關系,為了調用剛才提到的QWidget的功能,我必須使用dynamic_cast來轉換我知道從“myScreen”和“QWidget”派生的“myScreen”方法中的windows。

我知道最好的方法可能是讓“myScreen”派生自 QWidget 和所有其他 windows 派生自此,但我的目標是盡可能少地更改現有代碼。 我也嘗試使用虛擬 inheritance,但由於 moc 自動生成的文件,這種方法無法工作(請參閱此鏈接無法從指向基礎 class 的指針轉換為指向派生 class 的指針)。

到目前為止,我設法確保“myScreen”的構造函數由派生自 QWidget 的 class 調用:

struct isQWidget{
    class QWidgetType{
        QWidgetType(){}
        friend struct isQWidget;
    };
    template<class T>
    static QWidgetType isQwidgetType(const T&){
        static_assert (std::is_base_of<QWidget, T>::value, "Error: not a QWidget");
        return QWidgetType();
    }
};

構造函數聲明:

myScreen(myScreen& parentScreen, isQWidget::QWidgetType);

構造函數定義:

sigin::sigin(QWidget *parent, myScreen& si) :
    QWidget(parent),
    myScreen(si, isQWidget::isQwidgetType(*this)),
    ui(new Ui::sigin)
{
    ui->setupUi(this);
}

我想將指向 myScreen 的指針視為指向“myScreen”編譯時內的 QWidget 的指針,因為我知道我將始終使用從 QWidget 派生的東西。

關於如何解決這個問題的任何想法?

我有這樣的想法

template <typename T>
myScreen::myScreen(T &parent)
{
    static_assert(std::is_base_of<QWidget, T>::value, "Error: not a QWidget");
    QWidget &parentQt = dynamic_cast<QWidget&>(parent); // guaranteed to succeed in runtime by the above
    ...
}

因此,對於不從QWidget繼承的父級,這將是一個編譯錯誤,並且總是會成功轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM