decltype.hpp

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

HPP
454
字号
            ////////////////////////////////////////////////////////////////////////////////////////////            template<typename T>            struct has_get_pointer            {                static T &t;                BOOST_STATIC_CONSTANT(bool, value = sizeof(void *) == sizeof(get_pointer(t)));                typedef mpl::bool_<value> type;            };        }        using has_get_pointer_::has_get_pointer;                ////////////////////////////////////////////////////////////////////////////////////////////        namespace get_pointer_        {            using boost::get_pointer;            template<typename T>            typename disable_if<has_get_pointer<T>, T *>::type            get_pointer(T &t)            {                return boost::addressof(t);            }            template<typename T>            typename disable_if<has_get_pointer<T>, T const *>::type            get_pointer(T const &t)            {                return boost::addressof(t);            }                        ////////////////////////////////////////////////////////////////////////////////////////////            template<                typename T              , typename U              , bool IsMemPtr = is_member_object_pointer<                    typename remove_reference<U>::type                >::value            >            struct mem_ptr_fun            {                BOOST_PROTO_DECLTYPE_(                    proto::detail::make_mutable<T>() ->* proto::detail::make<U>()                  , result_type                )                result_type operator()(                    typename add_reference<typename add_const<T>::type>::type t                  , typename add_reference<typename add_const<U>::type>::type u                ) const                {                    return t ->* u;                }            };            ////////////////////////////////////////////////////////////////////////////////////////////            template<typename T, typename U>            struct mem_ptr_fun<T, U, true>            {                BOOST_PROTO_DECLTYPE_(                    get_pointer(proto::detail::make_mutable<T>()) ->* proto::detail::make<U>()                  , result_type                )                result_type operator()(                    typename add_reference<typename add_const<T>::type>::type t                  , typename add_reference<typename add_const<U>::type>::type u                ) const                {                    return get_pointer(t) ->* u;                }            };        }        using get_pointer_::mem_ptr_fun;        ////////////////////////////////////////////////////////////////////////////////////////////        template<typename A0, typename A1>        struct comma_result        {            BOOST_PROTO_DECLTYPE_((proto::detail::make<A0>(), proto::detail::make<A1>()), type)        };        template<typename A0>        struct comma_result<A0, void>        {            typedef void type;        };        template<typename A1>        struct comma_result<void, A1>        {            typedef A1 type;        };        template<>        struct comma_result<void, void>        {            typedef void type;        };        ////////////////////////////////////////////////////////////////////////////////////////////        template<typename T>        struct result_of_member;                template<typename T, typename U>        struct result_of_member<T U::*>        {            typedef T type;        };        template<typename T, typename Void = void>        struct result_of_          : boost::result_of<T>        {};                template<typename T, typename U>        struct result_of_<T(U), typename enable_if<is_member_object_pointer<T> >::type>        {            typedef                typename result_of_member<T>::type            type;        };        template<typename T, typename U>        struct result_of_<T(U &), typename enable_if<is_member_object_pointer<T> >::type>        {            typedef                typename add_reference<                    typename result_of_member<T>::type                >::type            type;        };        template<typename T, typename U>        struct result_of_<T(U const &), typename enable_if<is_member_object_pointer<T> >::type>        {            typedef                typename add_reference<                    typename add_const<                        typename result_of_member<T>::type                    >::type                >::type            type;        };        ////////////////////////////////////////////////////////////////////////////////////////////        template<typename T, typename U = T>        struct result_of_fixup          : mpl::if_c<is_function<T>::value, T *, U>        {};        template<typename T, typename U>        struct result_of_fixup<T &, U>          : result_of_fixup<T, T>        {};        template<typename T, typename U>        struct result_of_fixup<T const &, U>          : result_of_fixup<T, T>        {};        template<typename T, typename U>        struct result_of_fixup<T *, U>          : result_of_fixup<T, U>        {};        template<typename R, typename T, typename U>        struct result_of_fixup<R T::*, U>        {            typedef R T::*type;        };        template<typename T, typename U>        struct result_of_fixup<T const, U>          : result_of_fixup<T, U>        {};        //// Tests for result_of_fixup        //struct bar {};        //BOOST_MPL_ASSERT((is_same<bar,        result_of_fixup<bar>::type>));        //BOOST_MPL_ASSERT((is_same<bar const,  result_of_fixup<bar const>::type>));        //BOOST_MPL_ASSERT((is_same<bar,        result_of_fixup<bar &>::type>));        //BOOST_MPL_ASSERT((is_same<bar const,  result_of_fixup<bar const &>::type>));        //BOOST_MPL_ASSERT((is_same<void(*)(),  result_of_fixup<void(*)()>::type>));        //BOOST_MPL_ASSERT((is_same<void(*)(),  result_of_fixup<void(* const)()>::type>));        //BOOST_MPL_ASSERT((is_same<void(*)(),  result_of_fixup<void(* const &)()>::type>));        //BOOST_MPL_ASSERT((is_same<void(*)(),  result_of_fixup<void(&)()>::type>));        template<typename T, typename PMF>        struct memfun        {            typedef typename remove_const<typename remove_reference<PMF>::type>::type pmf_type;            typedef typename boost::result_of<pmf_type(T)>::type result_type;            memfun(T t, PMF pmf)              : obj(t)              , pmf(pmf)            {}            result_type operator()() const            {                using namespace get_pointer_;                return (get_pointer(obj) ->* pmf)();            }            #define M0(Z, N, DATA)                                                                  \            template<BOOST_PP_ENUM_PARAMS_Z(Z, N, typename A)>                                      \            result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, const &a)) const          \            {                                                                                       \                using namespace get_pointer_;                                                       \                return (get_pointer(obj) ->* pmf)(BOOST_PP_ENUM_PARAMS_Z(Z, N, a));                  \            }                                                                                       \            /**/            BOOST_PP_REPEAT_FROM_TO(1, BOOST_PROTO_MAX_ARITY, M0, ~)            #undef M0        private:            T obj;            PMF pmf;        };    } // namespace detail}}#endif

⌨️ 快捷键说明

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