[/
 / Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 /
 / Distributed under the Boost Software License, Version 1.0. (See accompanying
 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 /]

[section:ResolveHandler Resolve handler requirements]

A resolve handler must meet the requirements for a [link
boost_asio.reference.Handler handler]. A value `h` of a resolve handler
class should work correctly in the expression `h(ec, i)`, where `ec` is an
lvalue of type `const error_code` and `i` is an lvalue of type `const
ip::basic_resolver_iterator<InternetProtocol>`. `InternetProtocol` is the
template parameter of the [link boost_asio.reference.ip__resolver_service
`resolver_service`] which is used to initiate the asynchronous operation.

[heading Examples]

A free function as a resolve handler:

  void resolve_handler(
      const boost::system::error_code& ec,
      boost::asio::ip::tcp::resolver::iterator iterator)
  {
    ...
  }

A resolve handler function object:

  struct resolve_handler
  {
    ...
    void operator()(
        const boost::system::error_code& ec,
        boost::asio::ip::tcp::resolver::iterator iterator)
    {
      ...
    }
    ...
  };

A non-static class member function adapted to a resolve handler using `bind()`:

  void my_class::resolve_handler(
      const boost::system::error_code& ec,
      boost::asio::ip::tcp::resolver::iterator iterator)
  {
    ...
  }
  ...
  resolver.async_resolve(...,
      boost::bind(&my_class::resolve_handler,
        this, boost::asio::placeholders::error,
        boost::asio::placeholders::iterator));

[endsect]
