12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #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
|