gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:56:07 29 4
gpt4 key购买 nike

我只想传递移动类型(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>]换句话说,它使用复制而不是移动。

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

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 的 delete copy constructor| .

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

最佳答案

总而言之,不幸的是,QtConcurrent 还不支持移动语义。

主要的解决方法是做 std::auto_ptr 所做的事情:在包装器中移动拷贝。很难,但是在将移动支持添加到 Qt 并发之前没有其他方法。不过,修补起来并不是什么特别困难的事情。

关于c++ - 在 c++11 模式下使用 QtConcurrent::run with move only 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49224755/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com