我有一個自定義代理模型,偶爾會在新的列/行添加到其源模型時進行自檢。從文檔看來,在這種操作的開始和結束處調用QAbstractItemModel::beginResetModel()和QAbstractItemModel::endResetModel()是正確的方法。不幸的是,我的檢修功能有幾個可能的退出點,我只知道我會忘記在每個退出點調用endResetModel
,因爲它變得更加複雜。ModelResetter RAII對象
因此,我想創建一個簡單的RAII類將調用beginResetModel
在建設,然後調用endResetModel
破壞時,如如下:
class ModelResetter
{
public:
ModelResetter(QAbstractItemModel* model) : m_model(model)
{
m_model->beginResetModel();
}
~ModelResetter()
{
m_model->endResetModel();
}
private:
QAbstractItemModel* m_model;
};
的問題是,beginResetModel()
和endResetModel()
在兩種protected
QAbstractItemModel
。聲明ModelResetter
作爲friend class
在我的繼承模型似乎沒有幫助,因爲我試圖與基類交互。
我寧願不爲我實現的每個模型都做一個自定義的實現,所以我可以使用模板來做到這一點?我對模板語法還不是很熟悉。
編輯1:(我取出樣品模板代碼編輯2,以避免混淆)
這會是很好,如果我能以某種方式限制模板,只允許繼承QAbstractItemModel
的類型,但我不在標準C++中看不到任何東西。我不會使用Boost。
編輯2:我想我並不是很清楚我的要求。在這裏,他們是:
- 操作,並且在基類一般情況下
- 強制執行,而在調試模式下
QAbstractItemModel
繼承需求而不受處罰在釋放模式 - 使用簡單,幾乎沒有開銷
- 不需要修改基類或新函數
這與[此鏈接]基本相反(http://stackoverflow.com/questions/2767525/friendness-and-derived-class)。請注意,在基礎實現中'beginResetModel()'和'endResetModel()'不是'virtual',所以我不能利用它。 – Phlucious 2013-03-07 17:41:45
也從'QAsbtractItemModel'繼承'ModelResetter':D – fasked 2013-03-07 18:33:49
聰明,但是這並不違背'is-a'繼承思想的每一條規則嗎? – Phlucious 2013-03-07 20:03:08