在 c++11 模式下使用 QtConcurrent::run with move only 参数
Use QtConcurrent::run with move only argument in c++11 mode
我想传递仅移动类型(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并发之前没有其他方法。不过,这并不是什么特别困难的事情。
相关文章:
- Problems with std::cin.fail()
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Issues with Win32 ReadProcessMemory API
- Qt with WinAPI MouseProc
- join() 失败,如果在线程内部调用 io_context.run()
- [[maybe_unused]] with structured_binding?
- Issue with WriteProcessMemory
- OpenCV RTP-Stream with FFMPEG
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- std::adjacent_difference with std::chrono time_point
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- DLL Made with CMake 使程序崩溃
- QtCreator with C 库中的链接器问题
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- 在 c++11 模式下使用 QtConcurrent::run with move only 参数
- QtConcurrent::run with lambda on mac os 没有提供匹配函数
- 在Android上运行自己的TensorFlow模型会产生原生推理错误:"Session was not created with a graph before Run()!"