我有一个用于包装boost :: asio的类,我使用模板来定义委托:
template <class T>
struct Socket : public std::enable_shared_from_this<Socket<T>> {
explicit Socket<T>(T &delegate, const std::string &socket) : endpoint_{socket} {
socket_.reset(new asio::generic::stream_protocol::socket(service_));
socket_->connect(endpoint_, delegate_.error_code);
socket_->non_blocking(true);
}
void read() const noexcept {
std::vector<byte> bytes;
asio::async_read(*socket_, asio::buffer(bytes), asio::transfer_all(), delegate_.on_read);
}
virtual ~Socket<T>() noexcept = default;
private:
asio::io_service service_;
std::unique_ptr<asio::generic::stream_protocol::socket> socket_;
asio::local::stream_protocol::endpoint endpoint_;
T delegate_;
std::vector<byte> buffer_;
};
我的问题是将委托方法作为处理程序传递给asio::async_read
会导致错误
必须调用对非静态成员函数的引用
执行此操作的正确语法是什么?
答案 0 :(得分:2)
delegate.on_read
是一个非静态成员函数,因此需要调用一个对象。您可以使用lambda绑定对象参数:
auto read_handler =
[this](const boost::system::error_code& ec, std::size_t bytes_transferred) {
on_read(ec, bytes_transferred);
};
asio::async_read(*socket_, asio::buffer(bytes),
asio::transfer_all(), read_handler);
未经测试,但这样的事情应该有用。