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...
}
我无法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...
}