gpt4 book ai didi

c++ - boost::ref 和 boost::asio 完成处理程序,按引用传递

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:09 27 4
gpt4 key购买 nike

m_io_service.post(boost::ref(i));

我在一段代码中有这个调用,底层类型 i 绝对是一个可调用的(因为删除 boost::ref 导致按值传递,这工作正常),但是 clang 告诉我:

/opt/dev_64_swat/proto-rpc2/dependencies/boost/include/boost/asio/handler_invoke_hook.hpp:64:3: error: type 'boost::reference_wrapper<rubble::rpc::TcpFrontEndConnectionInvoker>' does not provide a call operator

我如何通过引用传递,我有比异步调用生命周期更长的对象,如果我可以通过引用传递它们,它们会更优雅(更少 boost::shared_ptr<..> 作为成员)。

-- 编辑--

我已经搜索了 asio 的示例目录,boost::ref 没有为完成处理程序演示。所以我想我在这里运气不好。处理程序没有接受 ref 的版本是有原因的吗?

-- 编辑 2:我看起来像什么(除非您怀疑实现,否则不要费心看这个)。 --

namespace rubble { namespace rpc {
struct InProcessInvoker : public InvokerBase
{
struct notification_object_
{
typedef notification_object_ * ptr;

notification_object_()
{
reset();
}
void reset()
{
ready = false;
}
bool ready;
boost::mutex mutex;
boost::condition_variable cond;
};

InProcessInvoker(BackEnd & b_in)
: b(b_in),
notification_object(new notification_object_())
{
b.connect(m_client_data);
}

~InProcessInvoker()
{
if( m_client_data.unique() )
{
b.disconect(m_client_data);
delete notification_object;
}
}

bool is_useable()
{
return b.is_useable();
}

void reset()
{
notification_object->reset();
m_client_data->request().Clear();
m_client_data->response().Clear();
m_client_data->error_code().clear();
BOOST_ASSERT_MSG( m_client_data->is_rpc_active() == false,
"THE FLAG THAT REPRESENTS ACTIVE "
"RPC SHOULD NOT BE SET WHEN RESETING AN OBJECT FOR RPC");
}

void invoke()
{
b.invoke(*this);
}

void operator() ()
{
service->dispatch(*client_cookie,*m_client_data);
b.end_rpc(m_client_data.get());

boost::lock_guard<boost::mutex> lock(notification_object->mutex);
notification_object->ready=true;
notification_object->cond.notify_one();
}

void after_post()
{
boost::unique_lock<boost::mutex> lock(notification_object->mutex);
if(!notification_object->ready)
notification_object->cond.wait(lock);
}

notification_object_::ptr notification_object;
BackEnd & b;
};

} }

最佳答案

boost::ref不提供 operator() 的重载.因此,返回不能直接用作回调。有 2 个选项:

  1. C++03:使用 boost::bind包装 ref,它会做你想做的事

    m_io_service.post(boost::bind<ReturnType>(boost::ref(i)))

    请注意,您必须指定返回类型,除非原始仿函数 iresult_type 的类型定义

  2. C++11:使用 std::ref相反,它确实提供了一个 operator() 传递给包含的引用

    m_io_service.post(std::ref(i))

关于c++ - boost::ref 和 boost::asio 完成处理程序,按引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7282876/

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