【问题标题】:How to use QtConcurrent::mappedReduced with lambdas or std::functions of lambdas?如何将 QtConcurrent::mappedReduced 与 lambdas 或 lambdas 的 std::functions 一起使用?
【发布时间】:2021-05-11 20:11:37
【问题描述】:

我想将 Qt 的 mappedReduced 与 lambda 一起使用。

Make QtConcurrent::mapped work with lambdas 的回答似乎表明这是不可能直接实现的,但可以通过使用std::function 来实现。

虽然我可以通过这种方式构建编译器接受的对mapped() 的调用,但我无法弄清楚如何以编译器想要编译的方式将该原理应用于mappedReduced()。这应该如何表述?

简单示例:

    int cap = 1;
    std::function<int(char)> mlf = [cap](char c){ return static_cast<int>(c)+cap; };
    std::function<void(double&,int const&)> rlf = [cap](double &d,int const &i){ d += static_cast<double>(i+cap); };
    QVector<char> seq = {'a','b','c'};
    QVector<int> v = QtConcurrent::blockingMapped( seq, mlf );
    double d =  QtConcurrent::blockingMappedReduced( seq, mlf, rlf );

[注意:最终代码必须支持捕获,因此我在此示例中包含了捕获。在这里删除捕获不会让编译器满意。]

IDE/编译器抱怨:

qtsupplement.cpp:291:17: error: no matching function for call to 'blockingMappedReduced'
qtconcurrentmap.h:199:12: note: candidate template ignored: couldn't infer template argument 'ResultType'
qtconcurrentmap.h:213:65: note: candidate template ignored: substitution failure [with MapFunctor = std::function<int (char)>, ReduceFunctor = std::function<void (double &, const int &)>, Sequence = QVector<char>]: implicit instantiation of undefined template 'QtPrivate::ReduceResultType<std::function<void (double &, const int &)> >'
qtconcurrentmap.h:228:12: note: candidate function template not viable: requires at least 4 arguments, but 3 were provided
qtconcurrentmap.h:243:65: note: candidate function template not viable: requires at least 4 arguments, but 3 were provided

而'ResultType'应该是变量d的类型,rlf()的第一个参数也暗示了结果类型。

使用的版本:qt5.5.1、g++5.4.0、qtcreator4.9.0

【问题讨论】:

    标签: qt c++11 lambda qt5 qtconcurrent


    【解决方案1】:

    以下代码适用于我(Qt 6.0.3,C++17):

    int cap = 1;
    QVector<char> seq = {'a','b','c'};
    QVector<int> v = QtConcurrent::blockingMapped<QVector<int>>(
        seq,
        [cap](char c){ return static_cast<int>(c)+cap; }
    );
    double d = QtConcurrent::blockingMappedReduced<double>(
        seq,
        [cap](char c){ return static_cast<int>(c)+cap; },
        [cap](double &d,int const& i){ d += static_cast<double>(i+cap); }
    );
    

    所以你应该使用 Qt 6.0.3 并指定模板参数。

    【讨论】:

    • 谢谢!目前无法彻底测试,但快速检查表明 IDE 不再抱怨(即使使用 QT5.12)。
    • @kaba 在 Qt 5.15.2 中获取“无法形成对 'void' 的引用”。
    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2021-07-31
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多