我正在尝试创建一个通用类,该类根据提供给该类的参数的数量有条件地调用一个函数。我一直在使用std :: enable_if,但无济于事。
我使用三个函数(用于2个可选的类参数)尝试了各种不同的方法。我在这里阅读了许多关于堆栈溢出的不同文章,这是我目前使用的方式,但是仍然出现错误。
#include <qsqldatabase.h>
template<class EditorDialog, typename FirstOpt = void, typename SecondOpt = void>
class GenericItemDelegate : public QItemDelegate {
public:
explicit GenericItemDelegate( QSqlDatabase &connection, QObject *parent = 0 ) : QItemDelegate( parent ), connection( connection ) {}
protected:
QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const override {
return createEditorHidden( parent );
}
void setEditorData( QWidget *editor, const QModelIndex &index ) const override {
EditorDialog *dialog = static_cast<EditorDialog *>( editor );
dialog->loadData( index.data( Qt::ItemDataRole::UserRole ) );
}
void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const override {
EditorDialog *dialog = static_cast<EditorDialog *>( editor );
if ( dialog->result() == QDialog::Accepted ) {
model->setData( index, QVariant::fromValue( dialog->getData() ) );
}
}
private:
template<typename f = FirstOpt, typename s = SecondOpt, typename std::enable_if<std::is_void<f>::value && std::is_void<s>::value, QWidget *>::type = true>
QWidget *createEditorHidden( QWidget *parent ) const {
return new EditorDialog( connection, parent );
}
template<typename f = FirstOpt, typename s = SecondOpt, typename std::enable_if<!std::is_void<f>::value && !std::is_void<s>::value, QWidget *>::type = true>
QWidget * createEditorHidden( QWidget * parent ) const {
return new EditorDialog( connection, parent, FirstOpt );
}
template<typename f = FirstOpt, typename s = SecondOpt, typename std::enable_if<!std::is_void<f>::value && !std::is_void<s>::value, QWidget *>::type = true>
QWidget * createEditorHidden( QWidget * parent ) const {
return new EditorDialog( connection, parent, FirstOpt, SecondOpt );
}
QSqlDatabase connection;
};
我目前通过以上方法得到的是error C2672: 'GenericItemDelegate<CreateFormulaDialog,void,void>::createEditorHidden': no matching overloaded function found
,对我来说这没有意义,因为(在这种情况下)两个模板参数都是无效的。
最后,有效地,我希望使用GenericItemDelegate<CreateFormulaDialog>
创建的对象调用第一个模板函数,用GenericItemDelegate<CreateFormulaDialog, true>
创建的对象调用第二个模板函数,并用GenericItemDelegate<CreateFormulaDialog,true,false>
创建第三个模板函数。
希望我有道理。我花了最后几个小时来解决这个问题,但我的大脑不再工作了。