QtConcurrent ::运行重载静态方法

时间:2016-09-15 22:27:46

标签: c++ qt overloading qtconcurrent

我无法让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);

我明白了:

  

错误:没有匹配函数来调用'run(ResType(*)(const cv :: Mat&amp;,const cv :: TermCriteria&amp;,const QStringList&amp;,const QStringList&amp;,int,int),cv :: Mat&amp; ;,cv :: TermCriteria&amp;,QStringList&amp;,QStringList&amp;,int&amp;,int&amp;)'              sampleData,tc,mDimNames,mGmmNames,mClusterN,mCovType);

请注意整数参数的错误消息中的ref(&amp;)。这让我很困惑......

params的类型:

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

我认为static_cast有助于区分重载。我能看到的唯一区别是,params部分不是const。但是你可以使用一个值类型参数的const引用,那么为什么会这么重要......

2 个答案:

答案 0 :(得分:2)

答案是静态成员函数类型是常规函数,而不是成员函数,因为它没有隐式this,因此在{{1}之前删除Foobar::部分自编译问题以来应该。

编辑:

在问题版本和OP添加的答案之后,我想提一下*不是一个很好的解决方案。它非常容易出错,特别是在&#34; get by ref&#34;如果你不是很小心的话很容易成为副本。更好的解决方案是使用lambda代替。 E.g:

std::bind

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

答案 1 :(得分:0)

std ::绑定救援。出于某种原因,它可以找出正确的类型:

#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...
}