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

Passing a static member function as argument

本文关键字:参数传递 函数 静态成员      更新时间:2023-10-16

我想存储并更新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个参数的函数。我做错了什么?

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

C++11 std::函数是否限制了函数指针可以具有的参数数量?

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

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