【发布时间】:2018-06-01 03:51:02
【问题描述】:
我正在尝试拥有两个 eachPixel 函数。一个返回图像,另一个不返回任何内容。即使我指定了 lambda 的返回类型,我也会收到“对 eachPixel 的调用不明确”。
如何解决歧义?
// this one does not return an image
void eachPixel(const QImage &image, const std::function <void (uint)>& pixelFunc, const QRect &bounds=QRect()) {
...
for (int y=region.y(); y<=region.bottom(); y++) {
for (int x=region.x(); x<=region.right(); x++) {
pixelFunc(image.pixel(x,y));
}
}
}
// This one returns an image
QImage eachPixel(const QImage &image, const std::function <uint (uint)>& pixelFunc, const QRect &bounds=QRect()) {
...
QImage out(image.size(), image.format());
for (int y=region.y(); y<=region.bottom(); y++) {
for (int x=region.x(); x<=region.right(); x++) {
out.setPixel(x,y, pixelFunc(image.pixel(x,y)));
}
}
return out;
}
void test_pixelFunc() {
QImage image(300,200, QImage::Format_ARGB32);
image.fill(Qt::blue);
QImage out = eachPixel(image, [] (uint p) -> uint { //uint specified!!
return qRgb(qRed(p), qBlue(p), qGreen(p)); // swap green and blue channels
}, QRect (0,0, 300, 200));
out.save("test_pixelfunc.png");
int accumulator=0;
eachPixel(image, [&accumulator](uint p) -> void { // void specified!
accumulator++;
}, QRect (0,0, 300, 200));
qDebug() << "accumulator" << accumulator;
};
【问题讨论】:
-
我认为问题是返回
uint的 lambda 可以绑定到std::function<void(uint)>,因为可以忽略返回值 -
标签调度是区分这些函数的标准方法。
-
你打算在通用代码中使用这些函数吗(每个函数都可以根据类型使用)?如果没有,那么给他们不同的名字是一个最简单的解决方案。