123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #ifndef BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
- #define BOOST_VARIANT_DETAIL_APPLY_VISITOR_DELAYED_HPP
- #include <boost/variant/detail/apply_visitor_unary.hpp>
- #include <boost/variant/detail/apply_visitor_binary.hpp>
- #include <boost/variant/variant_fwd.hpp>
- #include <boost/variant/detail/has_result_type.hpp>
- #include <boost/core/enable_if.hpp>
- namespace boost {
- template <typename Visitor>
- class apply_visitor_delayed_t
- {
- public:
- typedef typename Visitor::result_type
- result_type;
- private:
- Visitor& visitor_;
- public:
- explicit apply_visitor_delayed_t(Visitor& visitor) BOOST_NOEXCEPT
- : visitor_(visitor)
- {
- }
- public:
- template <typename... Visitables>
- result_type operator()(Visitables&... visitables) const
- {
- return apply_visitor(visitor_, visitables...);
- }
- private:
- apply_visitor_delayed_t& operator=(const apply_visitor_delayed_t&);
- };
- template <typename Visitor>
- inline typename boost::enable_if<
- boost::detail::variant::has_result_type<Visitor>,
- apply_visitor_delayed_t<Visitor>
- >::type apply_visitor(Visitor& visitor)
- {
- return apply_visitor_delayed_t<Visitor>(visitor);
- }
- #if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO)
- template <typename Visitor>
- class apply_visitor_delayed_cpp14_t
- {
- private:
- Visitor& visitor_;
- public:
- explicit apply_visitor_delayed_cpp14_t(Visitor& visitor) BOOST_NOEXCEPT
- : visitor_(visitor)
- {
- }
- public:
- template <typename... Visitables>
- decltype(auto) operator()(Visitables&... visitables) const
- {
- return apply_visitor(visitor_, visitables...);
- }
- private:
- apply_visitor_delayed_cpp14_t& operator=(const apply_visitor_delayed_cpp14_t&);
- };
- template <typename Visitor>
- inline typename boost::disable_if<
- boost::detail::variant::has_result_type<Visitor>,
- apply_visitor_delayed_cpp14_t<Visitor>
- >::type apply_visitor(Visitor& visitor)
- {
- return apply_visitor_delayed_cpp14_t<Visitor>(visitor);
- }
- #endif
- }
- #endif
|