//----------------------------------------------------------------------------- // boost variant/static_visitor.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_STATIC_VISITOR_HPP #define BOOST_VARIANT_STATIC_VISITOR_HPP #include "boost/config.hpp" #include "boost/detail/workaround.hpp" #include "boost/mpl/if.hpp" #include "boost/type_traits/is_base_and_derived.hpp" #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) # include "boost/type_traits/is_same.hpp" #endif // should be the last #include #include "boost/type_traits/detail/bool_trait_def.hpp" namespace boost { ////////////////////////////////////////////////////////////////////////// // class template static_visitor // // An empty base class that typedefs the return type of a deriving static // visitor. The class is analogous to std::unary_function in this role. // namespace detail { struct is_static_visitor_tag { }; typedef void static_visitor_default_return; } // namespace detail template class static_visitor : public detail::is_static_visitor_tag { public: // typedefs typedef R result_type; protected: // for use as base class only static_visitor() { } ~static_visitor() { } }; ////////////////////////////////////////////////////////////////////////// // metafunction is_static_visitor // // Value metafunction indicates whether the specified type derives from // static_visitor<...>. // // NOTE #1: This metafunction does NOT check whether the specified type // fulfills the requirements of the StaticVisitor concept. // // NOTE #2: This template never needs to be specialized! // namespace detail { template struct is_static_visitor_impl { BOOST_STATIC_CONSTANT(bool, value = (::boost::is_base_and_derived< detail::is_static_visitor_tag, T >::value)); }; } // namespace detail BOOST_TT_AUX_BOOL_TRAIT_DEF1( is_static_visitor , T , (::boost::detail::is_static_visitor_impl::value) ) } // namespace boost #include "boost/type_traits/detail/bool_trait_undef.hpp" #endif // BOOST_VARIANT_STATIC_VISITOR_HPP