从返回绑定中获取函数失败

get function from returning of bind failed

本文关键字:函数 失败 获取 返回 绑定      更新时间:2023-10-16

我试图从 std::bind 的结果中获取一个 std::function。 但是当我尝试编译下面的代码时出现错误,其中data_struct_call_ptr和tracking_call_ptr指向两个资源池,这两个资源池重载了它们的 () 运算符,使它们成为可调用的对象。 但是它们无法复制,所以我在这里使用 std::ref 来包装它们。

我应该能够将ve_ptr传输到异步执行的 lambda。但是,我在开始时遇到编译错误。

代码和编译错误如下。 任何帮助将不胜感激。

Error VSEService::TaskNew(const NewTaskRequest* req, NewTaskResponse* resp) {
shared_ptr<::Config> conf(Config::CreateInstance(-1, -1));
shared_ptr<FrameCallType> data_struct_call_ptr = make_shared<FrameCallType>();
shared_ptr<TrackCallType> tracking_call_ptr = make_shared<TrackCallType>();
std::function<void(ObjPtrWithFramePtr)> dc = ref(*data_struct_call_ptr);
std::function<void(FramePtr)> fc = ref(*tracking_call_ptr);
std::promise<bool> initialized_promise;
std::future<bool> initialized = initialized_promise.get_future();
shared_ptr<VideoEngine> ve = nullptr;
shared_ptr<VideoEngine*> ve_ptr = make_shared<VideoEngine*>(nullptr);
shared_ptr<tbb_app> app = nullptr;
Config* raw_conf = conf.get();
std::function<DGStatus(DGFrame)> pushcall = bind([](DGFrame f, std::function<void(ObjPtrWithFramePtr)>&& _dc,
std::function<void(FramePtr)>&& _fc,
shared_ptr<VideoEngine*> _ve_ptr,
std::promise<bool>&& _initialized_promise,
::Config* _raw_conf) -> DGStatus {
if (*_ve_ptr == nullptr) {
*_ve_ptr = VideoEngine::NewVideoEngineFromConfPtr(_raw_conf, f.w, f.h, _dc, _fc);
_initialized_promise.set_value(true);
}
(*_ve_ptr)->PushFrame(f);
}, std::placeholders::_1, std::move(dc), std::move(fc), ve_ptr, std::move(initialized_promise), raw_conf);
std::shared_ptr<std::function<DGStatus(DGFrame)>> pushcall_ptr = make_shared<std::function<DGStatus(DGFrame)>>(std::move(pushcall));

编译错误令人困惑。为什么不能将绑定结果转换为函数?

/home/deepglint/code/dgstream/src/services/vse_service.cpp: In member function ‘Error VSEService::TaskNew(const dgvse::NewTaskRequest*, dgvse::NewTaskResponse*)’:
/home/deepglint/code/dgstream/src/services/vse_service.cpp:99:109: error: conversion from ‘std::_Bind_helper<false, VSEService::TaskNew(const dgvse::NewTaskRequest*, dgvse::NewTaskResponse*)::__lambda13, const std::_Placeholder<1>&, std::function<void(ObjPtrWithFramePtr)>, std::function<void(std::shared_ptr<ObjFrame>)>, std::shared_ptr<VideoEngine*>&, std::promise<bool>, Config*&>::type {aka std::_Bind<VSEService::TaskNew(const dgvse::NewTaskRequest*, dgvse::NewTaskResponse*)::__lambda13(std::_Placeholder<1>, std::function<void(ObjPtrWithFramePtr)>, std::function<void(std::shared_ptr<ObjFrame>)>, std::shared_ptr<VideoEngine*>, std::promise<bool>, Config*)>}’ to non-scalar type ‘std::function<DGStatus(DGFrame)>’ requested
}, std::placeholders::_1, std::move(dc), std::move(fc), ve_ptr, std::move(initialized_promise), raw_conf);
                                       ^
make[2]: *** [src/CMakeFiles/dgstream.dir/services/vse_service.cpp.o] 错误 1
make[1]: *** [src/CMakeFiles/dgstream.dir/all] 错误 2
make: *** [all] 错误 2

看起来你不需要在那里绑定任何东西。

您可以尝试完全删除绑定,并指定您希望如何在捕获子句 [] 中捕获参数,例如[&dc, &fc, ve_ptr...],并调整 lambda 参数以匹配所需的签名。