C ++ 14似乎有答案: 如何将unique_ptr捕获到lambda表达式中? 使用kj :: heap在堆上分配两个对象,并将kj :: Own移动到回调lambda:
for(auto& slave : slaveList) { try { auto client = kj::heap<capnp::EzRpcClient>(slave.second->address); auto comparer = kj::heap<CompareNetwork::Client>(client->getMain<CompareNetwork>()); auto request = comparer->loadRequest(); std::string addrCopy(slave.first); request.setIds(loadData); auto loadPromise = request.send(); promList.add(loadPromise.then([addrCopy, client = std::move(client), comparer = std::move(comparer)](auto response) { return std::make_pair(addrCopy, response.getStatus()); }, [&, addrCopy](kj::Exception && exception) { slaveListLock.lock(); slaveList.erase(addrCopy);//something failed, remove this slave! slaveListLock.unlock(); std::cout << "ErrLoad0: " << std::string(exception.getDescription()) << std::endl; return std::make_pair(addrCopy, CompareNetwork::Status::ERROR); })); } catch(...) { std::cout << "Error sending load to: " << slave.first << std::endl; } }
欢迎更好的想法,但目前似乎工作得很好:)