#ifndef BOOST_VARIANT_VISITOR_PTR_HPP
#define BOOST_VARIANT_VISITOR_PTR_HPP
#include <boost/variant/bad_visit.hpp>
#include <boost/variant/static_visitor.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/throw_exception.hpp>
#include <boost/type_traits/add_reference.hpp>
#include <boost/type_traits/is_reference.hpp>
#include <boost/type_traits/is_void.hpp>
namespace boost {
template <typename T, typename R>
class visitor_ptr_t
: public static_visitor<R>
{
private:
typedef R (*visitor_t)(T);
visitor_t visitor_;
public:
typedef R result_type;
private:
typedef typename mpl::eval_if<
is_reference<T>
, mpl::identity<T>
, add_reference<const T>
>::type argument_fwd_type;
public:
explicit visitor_ptr_t(visitor_t visitor) BOOST_NOEXCEPT
: visitor_(visitor)
{
}
public:
template <typename U>
result_type operator()(const U&) const
{
boost::throw_exception(bad_visit());
}
public:
result_type operator()(argument_fwd_type operand) const
{
return visitor_(operand);
}
};
template <typename R, typename T>
inline visitor_ptr_t<T,R> visitor_ptr(R (*visitor)(T))
{
return visitor_ptr_t<T,R>(visitor);
}
}
#endif