12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- //-----------------------------------------------------------------------------
- // boost variant/detail/apply_visitor_delayed.hpp header file
- // See http://www.boost.org for updates, documentation, and revision history.
- //-----------------------------------------------------------------------------
- //
- // Copyright (c) 2002-2003
- // Eric Friedman
- //
- // 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)
- #ifndef BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
- #define BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
- #include "boost/variant/detail/generic_result_type.hpp"
- #include "boost/variant/detail/apply_visitor_unary.hpp"
- #include "boost/variant/detail/apply_visitor_binary.hpp"
- namespace boost {
- //////////////////////////////////////////////////////////////////////////
- // function template apply_visitor(visitor)
- //
- // Returns a function object, overloaded for unary and binary usage, that
- // visits its arguments using visitor (or a copy of visitor) via
- // * apply_visitor( visitor, [argument] )
- // under unary invocation, or
- // * apply_visitor( visitor, [argument1], [argument2] )
- // under binary invocation.
- //
- // NOTE: Unlike other apply_visitor forms, the visitor object must be
- // non-const; this prevents user from giving temporary, to disastrous
- // effect (i.e., returned function object would have dead reference).
- //
- template <typename Visitor>
- class apply_visitor_delayed_t
- {
- public: // visitor typedefs
- typedef typename Visitor::result_type
- result_type;
- private: // representation
- Visitor& visitor_;
- public: // structors
- explicit apply_visitor_delayed_t(Visitor& visitor)
- : visitor_(visitor)
- {
- }
- public: // unary visitor interface
- template <typename Visitable>
- BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
- operator()(Visitable& visitable) const
- {
- return apply_visitor(visitor_, visitable);
- }
- public: // binary visitor interface
- template <typename Visitable1, typename Visitable2>
- BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(result_type)
- operator()(Visitable1& visitable1, Visitable2& visitable2) const
- {
- return apply_visitor(visitor_, visitable1, visitable2);
- }
- private:
- apply_visitor_delayed_t& operator=(const apply_visitor_delayed_t&);
- };
- template <typename Visitor>
- inline apply_visitor_delayed_t<Visitor> apply_visitor(Visitor& visitor)
- {
- return apply_visitor_delayed_t<Visitor>(visitor);
- }
- } // namespace boost
- #endif // BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
|