传递静态成员函数作为参数

时间:2014-09-02 11:43:38

标签: c++ qt c++11

我想存储和更新QFileDialog::getOpenFileNameQFileDialog::getSaveFileName使用的默认目录路径。为此,我围绕第二个和第三个常用函数创建了包装函数:

QString GetSaveFile (QWidget *parent, const QString &title, const QString &desc)
{
    return GetFile (&QFileDialog::getSaveFileName, parent, title, desc);
}

QString GetOpenFile (QWidget *parent, const QString &title, const QString &desc)
{
    return GetFile (&QFileDialog::getOpenFileName, parent, title, desc);
}

QString GetFile (std::function <QString (QWidget *, const QString&, const QString&, const QString&, QString*, QFileDialog::Options)> func,
                 QWidget *parent, const QString &title, const QString &desc)
{
    // this produces C2064
    QString path = func (parent, title, CurrentDir, desc, 0, 0);
    if (!path.isEmpty())
        UpdateCurrentDir (QFileInfo (path).absoluteDir().path());
    return path;
}

然而,在编译期间,我得到了

error C2064: term does not evaluate to a function taking 6 arguments

但是我的第一个参数一个带有6个参数的函数。我做错了什么?

1 个答案:

答案 0 :(得分:1)

我明白了。这与变量函数的MSVC限制有关,如下所述:

Does C++11 std::function limit the number of arguments a function pointer can have?

在MSVC中,默认情况下,可变参数函数不能接受超过5个参数。重新定义_VARIADIC_MAX解决了问题:

#ifdef _VARIADIC_MAX
    #undef _VARIADIC_MAX
#endif
#define _VARIADIC_MAX 10