QtConcurrent::run 重载静态方法

QtConcurrent::run with overloaded static method

我无法QtConcurrent::run使用重载的静态方法:

class Foobar {
public:
    static ResType foo(const cv::Mat& data, const QStringList& names, int clusters = 5);
    static ResType foo(const cv::Mat& data, const cv::TermCriteria& tc, const QStringList& names, const QStringList& otherNames, int clusters, int covType = 2);
}

QtConcurrent::run(
    static_cast<ResType (*)(const cv::Mat&, const cv::TermCriteria&,
        const QStringList&, const QStringList&, int, int)>(&Foobar::foo),
        sampleData, tc, mDimNames, mGmmNames, mClusterN, mCovType);

我得到:

error: no matching function for call to ‘run(ResType (*)(const cv::Mat&, const cv::TermCriteria&, const QStringList&, const QStringList&, int, int), cv::Mat&, cv::TermCriteria&, QStringList&, QStringList&, int&, int&)’ sampleData, tc, mDimNames, mGmmNames, mClusterN, mCovType);

注意整数参数错误消息中的引用 (&)。这让我很困惑....

参数类型:

cv::Mat sampleData, cv::TermCriteria tc, QStringList mDimNames, QStringList mGmmNames, int mClusterN, int mCovType

我认为 static_cast 有助于区分重载。我能看到的唯一区别是,params 部分不是 const。但是您可以使用 Value 类型参数的 const ref,所以这有什么关系...

答案是静态成员函数类型是常规函数,不是成员函数,因为它没有隐含的this,所以去掉[=13]之前的Foobar::部分=]应该是因为编译问题。

编辑:

在问题编辑和 OP 添加的答案之后,我想提一下 std::bind 不是一个很好的解决方案。它非常容易出错,尤其是在 "get by ref" 附近,如果您不小心,它很容易成为副本。更好的解决方案是改用 lambda。例如:

auto future = QtConcurrent::run([&]{
    DkGmm::fromData(sampleData, tc, mDimNames, mGmmNames, mClusterN, mCovType); });

(在实际代码中,我可能会明确捕获每个参数,因为我认为使用默认捕获是 Bad Practice™。)

std::bind 来拯救。由于某种原因,它可以找出正确的类型:

#include <functional>

void test() {
    auto fn = std::bind(
        static_cast<DkGmm (*)(const cv::Mat&, const cv::TermCriteria&, const QStringList&, const QStringList&, int, int)>(&DkGmm::fromData),
        sampleData, tc, mDimNames, mGmmNames, mClusterN, mCovType);

    auto future = QtConcurrent::run(fn);
// ...code...
}