指定mapreduce函数
Specifying reduce functor for mappedReduce
我正在使用QtConcurrent并行运行某个任务。然而,我遇到了一个问题,当我真的改变使用mapappereduced而不是map.
下面是我使用的代码:struct ProcMapWrapper {
ConcurrentProcessTask *instance;
ProcMapWrapper(ConcurrentProcessTask *w): instance(w) {}
QString & operator()(const QString& data) {
return instance->map(data);
}
ProcMapWrapper(const ProcMapWrapper & src)
{
instance = src.instance;
}
typedef QString result_type;
};
struct ProcReduceWrapper {
ConcurrentProcessTask *instance;
ProcReduceWrapper(ConcurrentProcessTask *w): instance(w) {}
void operator()(int &number, const QString &fname) {
return instance->reduce(number,fname);
}
ProcReduceWrapper(const ProcReduceWrapper & src)
{
instance = src.instance;
}
typedef int result_type;
};
ProcMapWrapper mw(this);
ProcReduceWrapper rw(this);
futureWatcher.setFuture(QtConcurrent::mappedReduced(_files.begin(),_files.end(),mw,rw));
这个想法是使用processOneItem函数从输入字符串生成stage1Data结构,然后在reduce函数中清除并将结果保存在适当的容器中。
我做了一些研究,使我找到了这个源文件,它引用了这些代码片段。在这里,map函子的模板如下:
struct Scaled
{
Scaled(int size)
: m_size(size) { }
typedef QImage result_type;
QImage operator()(const QImage &image)
{
return image.scaled(m_size, m_size);
}
int m_size;
};
QList<QImage> images = ...;
QFuture<QImage> thumbnails = QtConcurrent::mapped(images, Scaled(100));
这确实适用于QtConcurrent的map
和mapped
函数,但是我试图用相同的模式制作一个reduce函子,再次导致这些错误:
..qt_photoaudtask.cpp(230):错误C2893:未能专门化函数模板"QFuture: ResultType>QtConcurrent:: mappedReduced(迭代器,迭代器,MapFunctor ReduceFunctor, QtConcurrent:: ReduceOptions)"使用以下模板参数:"QList:: iterator"与(T = QString]"ProcMapWrapper"qt_photoaudtask.cpp(230):错误C2783: 'QFuture .cpp 'QtConcurrent:: mappedReduced(迭代器,迭代器,MapFunctor ReduceFunctor, QtConcurrent:: ReduceOptions)"无法推断出"ResultType"的模板参数c:qt4.8.4includeqtcore././src/corelib/concurrent/qtconcurrentmap.h(152):见声明'QtConcurrent:: mappereduced 'qt_photoaudtask.cpp(230):错误C2893:无法专门化函数模板"QFuture: ResultType>QtConcurrent:: mappedReduced (const序列,, MapFunctor ReduceFunctor, QtConcurrent:: ReduceOptions) '使用以下模板参数:"QList:: iterator"与(T = QString]"QList:: iterator"与(T = QString]'ProcMapWrapper' ..qt_photoaudtask.cpp(230):错误C2783: 'QFuture QtConcurrent:: mappereduced (const Sequence&,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions)':不能推断"ResultType"的模板参数c:qt4.8.4includeqtcore././src/corelib/concurrent/qtconcurrentmap.h(125):见声明'QtConcurrent::mappedReduced'
reduce函子是否真的被定义和/或识别?QtPrivate::ReduceResultType::ResultType如何工作?它需要什么?
编辑:假设函数与boost::function兼容,我尝试在reduce functor中指定first_argument_type, second_argument_type, arg1_type和arg2_type。
我是这么做的:
struct concurrentProcessDBMapper
{
typedef stage1Data result_type;
stage1Data operator()(QString fname)
{
return concurrentProcessDBMap(fname);
}
};
struct concurrentProcessDBReducer
{
DatabaseConcurrentProcessTask *instance;
concurrentProcessDBReducer(DatabaseConcurrentProcessTask *i)
{
instance = i;
}
void operator()(int & number, const stage1Data in)
{
//concurrentProcessDBReduce
instance->reduce(number,in);
}
};
...
QFutureWatcher<int> futureWatcher;
QList<QString> _filesInWork;
...
futureWatcher.setFuture(
QtConcurrent::mappedReduced
<int, QList<QString>, concurrentProcessDBMapper,concurrentProcessDBReducer>
(_filesInWork,concurrentProcessDBMapper(),concurrentProcessDBReducer(this)));
...
总结一下,对于像-(map)->-(reduce)->这样的类型转换,map函函数的result_type定义为stage1Data,而reduce函函数根本没有定义任何result_type。Future watcher将其类型定义为reduce结果(即它的第一个out参数的类型)——在我的例子中是int——而mapappedreduced的模板形参是显式定义的。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 指定mapreduce函数