gpt4 book ai didi

c++ - 嵌套 boost::bind 与 io_service::post

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:04 24 4
gpt4 key购买 nike

我的问题的简短版本:

当我尝试像这样 boost::bind io_service::post 时:

boost::bind(&boost::asio_io_service::post, &ios,
boost::bind(&MyClass::func, this, arg1, arg2));

我收到这样的错误:

error: no matching function for call to ‘bind(<unresolved overloaded function type>,
boost::asio::io_service*, boost::_bi::bind_t<void, boost::_mfi::mf2<void, MyClass,
const char*, const char*>, boost::_bi::list3<boost::_bi::value<MyClass*>,
boost::_bi::value<const char*>, boost::_bi::value<const char*> > >)’

我该如何解决这个问题?

非常简单的测试代码:http://pastebin.com/V0uyLywC

我的问题的长版:

我正在尝试编写一个通用事件队列类,您可以将不同类型的事件添加到队列中。您可以按类型订阅事件,当添加该类型的事件时,将调用订阅的回调函数。

事件队列对象可能会被来自不同 io_services 的不同线程组订阅。此类的内部队列将使用 boost::lockfree:queue 或 boost::interprocess::message_queue 是线程安全的(如果将来是进程间的)。并且订阅的回调函数将需要由其相应的 io_service 的 post 调用,因此尝试了上面的嵌套 boost::bind。

这是一个好的且可行的设计吗?

假设这种方法行得通,我认为另一种方法是在您订阅时也传递 io_service,但我在想 1) 也许这个类可以在不涉及 io_services 时使用,并且 2) 这个类不应该不需要了解 io_service。

谢谢大家。

附言我读过boost::bind composition inside io_service::post function但感觉与我的问题有点不同。

最佳答案

更新所有解决方案 Live On Coliru

问题

第一个问题是post有重载,所以需要消歧。这很丑陋:

boost::bind(
static_cast<void (boost::asio::io_service::*)
(
boost::_bi::protected_bind_t<
boost::_bi::bind_t<
void,
boost::_mfi::mf2<void, MyClass, int, int>,
boost::_bi::list3<boost::_bi::value<MyClass *>,
boost::_bi::value<int>,
boost::_bi::value<int>
>
> > const&
)>(&boost::asio::io_service::post),
&ios_,
boost::protect(boost::bind(&MyClass::func, this, 7, 42)));

当然,您可以尝试使用decltype 和一些typedef:

auto nested = boost::protect(boost::bind(&MyClass::func, this, 7, 42));
typedef decltype(nested) actual_t; // _bi::protected_bind_t<bind_t<void, mf2<void, MyClass, int, int>, list3<value<MyClass *>, value<int>, value<int> > > >
typedef void (boost::asio::io_service::*pmf)(actual_t const&);
boost::bind(static_cast<pmf>(&boost::asio::io_service::post), &ios_, nested);

但这或多或少地驳斥了内联绑定(bind)表达式的初衷。


解决方案

或者你可以使用一个辅助仿函数,它隐藏了一个合适的多态 operator() 后面的重载集:

boost::bind(poster(ios_),
boost::protect(boost::bind(&MyClass::func, this, 7, 42)));

poster 助手的样子

struct poster {
typedef void result_type;

poster(boost::asio::io_service& ios) : ios_(ios) {}
boost::asio::io_service& ios_;

template<typename F> void operator()(F const& f) const {
ios_.post(f);
}

template<typename F> void operator()(F&& f) const {
ios_.post(std::move(f));
}
};

关于c++ - 嵌套 boost::bind 与 io_service::post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24162360/

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