在 c++11 模式下使用 QtConcurrent::run with move only 参数

Use QtConcurrent::run with move only argument in c++11 mode

本文关键字:run with only 参数 move QtConcurrent 模式 c++11      更新时间:2023-10-16

我想传递仅移动类型(std::unique_ptr只是为了最简短的例子(,到我想在Qt线程池中执行的功能,但是这样的代码会给出编译时错误:

#include <QtConcurrent>
#include <memory>
void f(std::unique_ptr<int>)
{
}
int main() {
    std::unique_ptr<int> p{new int{5}};
    QtConcurrent::run(f, std::move(p));
}

编译器抱怨这样的函数(Qt QtConcurrent/qtconcurrentrun.h的一部分(:

template <typename T, typename Param1, typename Arg1>
QFuture<T> run(T (*functionPointer)(Param1), const Arg1 &arg1)
{
    return (new StoredFunctorCall1<T, T (*)(Param1), Arg1>(functionPointer, arg1))->start();
}

需要std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [с _Tp = int; _Dp = std::default_delete<int>]换句话说,它使用复制而不是移动。

我只使用 C++11,用于其他接受Function的 Qt 函数,就像我使用std::bind技巧QObject::connect

std::bind([](const std::unique_ptr<int> &arg) {}, std::move(param));

但由于某种原因,这样的代码也无法编译:

std::unique_ptr<int> p{new int{5}};
auto func = std::bind([](std::unique_ptr<int>& a) {
        //call f here
    }, std::move(p));
QtConcurrent::run(func);

还抱怨删除std::unique_ptr的复制构造函数。

我当然可以用std::shared_ptr/QSharedPointer来解决它,但可能是一些没有额外内存分配的建议方法?

它的长短是,不幸的是,QtConcurrent 还不支持移动语义。

主要的解决方法是执行std::auto_ptr所做的操作:在包装器中移动副本。很难,但在将移动支持添加到Qt并发之前没有其他方法。不过,这并不是什么特别困难的事情。