decltype.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 454 行 · 第 1/2 页

HPP
454
字号
////////////////////////////////////////////////////////////////////////////////// \file decltype.hpp/// Contains definition the BOOST_PROTO_DECLTYPE_() macro and assorted helpers////  Copyright 2008 Eric Niebler. 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_PROTO_DETAIL_DECLTYPE_HPP_EAN_04_04_2008#define BOOST_PROTO_DETAIL_DECLTYPE_HPP_EAN_04_04_2008#include <boost/proto/detail/prefix.hpp> // must be first include#include <boost/config.hpp>#include <boost/get_pointer.hpp>#include <boost/preprocessor/cat.hpp>#include <boost/preprocessor/repetition/enum_params.hpp>#include <boost/preprocessor/repetition/enum_binary_params.hpp>#include <boost/preprocessor/repetition/repeat_from_to.hpp>#include <boost/mpl/if.hpp>#include <boost/type_traits/is_class.hpp>#include <boost/type_traits/remove_cv.hpp>#include <boost/type_traits/remove_reference.hpp>#include <boost/type_traits/is_pointer.hpp>#include <boost/type_traits/is_function.hpp>#include <boost/type_traits/is_member_object_pointer.hpp>#include <boost/type_traits/add_const.hpp>#include <boost/type_traits/add_reference.hpp>#include <boost/typeof/typeof.hpp>#include <boost/utility/addressof.hpp>#include <boost/utility/result_of.hpp>#include <boost/utility/enable_if.hpp>#include <boost/proto/detail/suffix.hpp> // must be last include// If we're generating doxygen documentation, hide all the nasty// Boost.Typeof gunk.#ifndef BOOST_PROTO_BUILDING_DOCS# ifdef BOOST_HAS_DECLTYPE#  define BOOST_PROTO_DECLTYPE_(EXPR, TYPE) typedef decltype(EXPR) TYPE;# else#  define BOOST_PROTO_DECLTYPE_NESTED_TYPEDEF_TPL_(NESTED, EXPR)                                    \    BOOST_TYPEOF_NESTED_TYPEDEF_TPL(BOOST_PP_CAT(nested_and_hidden_, NESTED), EXPR)                 \    static int const sz = sizeof(boost::proto::detail::check_reference(EXPR));                      \    struct NESTED                                                                                   \      : boost::mpl::if_c<                                                                           \            1==sz                                                                                   \          , typename BOOST_PP_CAT(nested_and_hidden_, NESTED)::type &                               \          , typename BOOST_PP_CAT(nested_and_hidden_, NESTED)::type                                 \        >                                                                                           \    {};#  define BOOST_PROTO_DECLTYPE_(EXPR, TYPE)                                                         \    BOOST_PROTO_DECLTYPE_NESTED_TYPEDEF_TPL_(BOOST_PP_CAT(nested_, TYPE), (EXPR))                   \    typedef typename BOOST_PP_CAT(nested_, TYPE)::type TYPE;# endif#else/// INTERNAL ONLY///# define BOOST_PROTO_DECLTYPE_(EXPR, TYPE)                                                          \    typedef detail::unspecified TYPE;#endifnamespace boost { namespace proto{    namespace detail    {        namespace anyns        {            ////////////////////////////////////////////////////////////////////////////////////////////            struct any            {                any(...);                any operator=(any);                any operator[](any);                #define M0(Z, N, DATA) any operator()(BOOST_PP_ENUM_PARAMS_Z(Z, N, any BOOST_PP_INTERCEPT));                BOOST_PP_REPEAT(BOOST_PROTO_MAX_ARITY, M0, ~)                #undef M0                template<typename T>                operator T &() const volatile;                any operator+();                any operator-();                any operator*();                any operator&();                any operator~();                any operator!();                any operator++();                any operator--();                any operator++(int);                any operator--(int);                friend any operator<<(any, any);                friend any operator>>(any, any);                friend any operator*(any, any);                friend any operator/(any, any);                friend any operator%(any, any);                friend any operator+(any, any);                friend any operator-(any, any);                friend any operator<(any, any);                friend any operator>(any, any);                friend any operator<=(any, any);                friend any operator>=(any, any);                friend any operator==(any, any);                friend any operator!=(any, any);                friend any operator||(any, any);                friend any operator&&(any, any);                friend any operator&(any, any);                friend any operator|(any, any);                friend any operator^(any, any);                friend any operator,(any, any);                friend any operator->*(any, any);                                friend any operator<<=(any, any);                friend any operator>>=(any, any);                friend any operator*=(any, any);                friend any operator/=(any, any);                friend any operator%=(any, any);                friend any operator+=(any, any);                friend any operator-=(any, any);                friend any operator&=(any, any);                friend any operator|=(any, any);                friend any operator^=(any, any);            };        }                using anyns::any;                ////////////////////////////////////////////////////////////////////////////////////////////        template<typename T>        struct as_mutable        {            typedef T &type;        };        template<typename T>        struct as_mutable<T &>        {            typedef T &type;        };        template<typename T>        struct as_mutable<T const &>        {            typedef T &type;        };        ////////////////////////////////////////////////////////////////////////////////////////////        template<typename T>        T make();        ////////////////////////////////////////////////////////////////////////////////////////////        template<typename T>        typename as_mutable<T>::type make_mutable();        ////////////////////////////////////////////////////////////////////////////////////////////        template<typename T>        struct subscript_wrapper          : T        {            using T::operator[];            any operator[](any) const volatile;        };        ////////////////////////////////////////////////////////////////////////////////////////////        template<typename T>        struct as_subscriptable        {            typedef                typename mpl::if_c<                    is_class<T>::value                  , subscript_wrapper<T>                  , T                >::type            type;        };        template<typename T>        struct as_subscriptable<T const>        {            typedef                typename mpl::if_c<                    is_class<T>::value                  , subscript_wrapper<T> const                  , T const                >::type            type;        };        template<typename T>        struct as_subscriptable<T &>        {            typedef                typename mpl::if_c<                    is_class<T>::value                  , subscript_wrapper<T> &                  , T &                >::type            type;        };        template<typename T>        struct as_subscriptable<T const &>        {            typedef                typename mpl::if_c<                    is_class<T>::value                  , subscript_wrapper<T> const &                  , T const &                >::type            type;        };        ////////////////////////////////////////////////////////////////////////////////////////////        template<typename T>        typename as_subscriptable<T>::type make_subscriptable();        ////////////////////////////////////////////////////////////////////////////////////////////        template<typename T>        char check_reference(T &);        template<typename T>        char (&check_reference(T const &))[2];        namespace has_get_pointer_        {            using boost::get_pointer;            void *(&get_pointer(...))[2];

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?