如何有条件地编译模板类的成员函数?

时间:2019-05-15 17:43:01

标签: c++ templates conditional-compilation

我正在尝试创建一个通用类,该类根据提供给该类的参数的数量有条件地调用一个函数。我一直在使用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>创建第三个模板函数。

希望我有道理。我花了最后几个小时来解决这个问题,但我的大脑不再工作了。

0 个答案:

没有答案