I'm trying to create an asynchronous tcp server which accepts connection. I'm about to use an accept handler function object which looks like the following:
template <typename Function>
struct callback
{
Function func_;
callback()
{
}
callback(Function&& f)
: func_(std::forward<Function>(f))
{
}
template <typename ...Args>
void operator() (Args&& ...args)
{
func_(std::forward<Args>(args)...);
}
};
My server class:
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <session.hpp>
#include <handler.hpp>
class server
{
private:
typedef callback<boost::function<void(const boost::system::error_code&, session_ptr&)>> accept_handler;
boost::asio::io_service& io_service_;
tcp::acceptor acceptor_;
accept_handler handler_;
public:
server(boost::asio::io_service& io_service, short port)
: io_service_(io_service),
acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
{
session_ptr new_session = session_ptr(new session(io_service_));
auto callback = boost::bind(&server::handle_accept,
this,
boost::asio::placeholders::error,
new_session);
handler_ = accept_handler(std::move(callback));
acceptor_.async_accept(new_session->socket(),
handler_);
}
void handle_accept(const boost::system::error_code& error, session_ptr new_session)
{
if (!error)
{
new_session->start();
new_session.reset(new session(io_service_));
acceptor_.async_accept(new_session->socket(),
handler_);
}
}
};
But when I try to compile I get following error:
error: no match for call to ‘(boost::function&)>) (const boost::system::error_code&)’ func_(std::forward(args)...);
So I must only use handler which meet AcceptHandler requirements
struct accept_handler
{
...
void operator()(
const boost::system::error_code& ec)
{
...
}
...
};
or there is a solution to use overloaded variadic template opreator() ?