⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 make.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
📖 第 1 页 / 共 2 页
字号:
#ifndef BOOST_PP_IS_ITERATING    ///////////////////////////////////////////////////////////////////////////////    /// \file make.hpp    /// Contains definition of the make<> transform.    //    //  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_TRANSFORM_MAKE_HPP_EAN_12_02_2007    #define BOOST_PROTO_TRANSFORM_MAKE_HPP_EAN_12_02_2007    #include <boost/proto/detail/prefix.hpp>    #include <boost/detail/workaround.hpp>    #include <boost/preprocessor/repetition/enum.hpp>    #include <boost/preprocessor/repetition/enum_params.hpp>    #include <boost/preprocessor/repetition/enum_trailing_params.hpp>    #include <boost/preprocessor/repetition/enum_binary_params.hpp>    #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>    #include <boost/preprocessor/repetition/repeat_from_to.hpp>    #include <boost/preprocessor/facilities/intercept.hpp>    #include <boost/preprocessor/cat.hpp>    #include <boost/preprocessor/iteration/iterate.hpp>    #include <boost/preprocessor/selection/max.hpp>    #include <boost/preprocessor/arithmetic/inc.hpp>    #include <boost/mpl/aux_/has_type.hpp>    #include <boost/mpl/aux_/template_arity.hpp>    #include <boost/mpl/aux_/lambda_arity_param.hpp>    #include <boost/utility/result_of.hpp>    #include <boost/type_traits/remove_const.hpp>    #include <boost/type_traits/remove_reference.hpp>    #include <boost/proto/proto_fwd.hpp>    #include <boost/proto/traits.hpp>    #include <boost/proto/args.hpp>    #include <boost/proto/transform/impl.hpp>    #include <boost/proto/detail/as_lvalue.hpp>    #include <boost/proto/detail/ignore_unused.hpp>    #include <boost/proto/detail/suffix.hpp>    namespace boost { namespace proto    {        namespace detail        {            template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_ARITY, typename A, void)>            struct typelist            {                typedef void type;            };            template<typename T, bool HasType = mpl::aux::has_type<T>::value>            struct nested_type            {                typedef typename T::type type;            };            template<typename T>            struct nested_type<T, false>            {                typedef T type;            };            template<typename T, typename Args, typename Void = void>            struct nested_type_if              : nested_type<T>            {};            template<typename R, typename Expr, typename State, typename Data                , bool IsTransform = is_callable<R>::value            >            struct make_if_;            template<typename R, typename Expr, typename State, typename Data                BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(long Arity = mpl::aux::template_arity<R>::value)            >            struct make_            {                typedef R type;                typedef void not_applied_;            };            template<typename R, typename Expr, typename State, typename Data>            struct make_if_<R, Expr, State, Data, false>              : make_<R, Expr, State, Data>            {};            #if BOOST_WORKAROUND(__GNUC__, == 3) || (__GNUC__ == 4 && __GNUC_MINOR__ == 0)            // work around GCC bug            template<typename Tag, typename Args, long N, typename Expr, typename State, typename Data>            struct make_if_<proto::expr<Tag, Args, N>, Expr, State, Data, false>            {                typedef proto::expr<Tag, Args, N> type;                typedef void not_applied_;            };            #endif            // TODO could optimize this if R is a transform            template<typename R, typename Expr, typename State, typename Data>            struct make_if_<R, Expr, State, Data, true>              : remove_const<typename remove_reference<                    typename boost::result_of<R(Expr, State, Data)>::type                >::type>            {};            template<typename Type, bool IsAggregate = is_aggregate<Type>::value>            struct construct_            {                typedef Type result_type;                Type operator ()() const                {                    return Type();                }                #define TMP(Z, N, DATA)                                                             \                template<BOOST_PP_ENUM_PARAMS_Z(Z, N, typename A)>                                  \                Type operator ()(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, &a)) const                  \                {                                                                                   \                    return Type(BOOST_PP_ENUM_PARAMS_Z(Z, N, a));                                   \                }                BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_PROTO_MAX_ARITY), TMP, ~)                #undef TMP            };            template<typename Type>            struct construct_<Type, true>            {                typedef Type result_type;                Type operator ()() const                {                    return Type();                }                #define TMP(Z, N, DATA)                                                             \                template<BOOST_PP_ENUM_PARAMS_Z(Z, N, typename A)>                                  \                Type operator ()(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, &a)) const                  \                {                                                                                   \                    Type that = {BOOST_PP_ENUM_PARAMS_Z(Z, N, a)};                                  \                    return that;                                                                    \                }                BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_PROTO_MAX_ARITY), TMP, ~)                #undef TMP            };            #define TMP(Z, N, DATA)                                                                 \            template<typename Type BOOST_PP_ENUM_TRAILING_PARAMS_Z(Z, N, typename A)>               \            Type construct(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, &a))                              \            {                                                                                       \                return construct_<Type>()(BOOST_PP_ENUM_PARAMS_Z(Z, N, a));                         \            }            BOOST_PP_REPEAT(BOOST_PROTO_MAX_ARITY, TMP, ~)            #undef TMP        }        /// \brief A PrimitiveTransform which prevents another PrimitiveTransform        /// from being applied in an \c ObjectTransform.        ///        /// When building higher order transforms with <tt>make\<\></tt> or        /// <tt>lazy\<\></tt>, you sometimes would like to build types that        /// are parameterized with Proto transforms. In such lambda-style        /// transforms, Proto will unhelpfully find all nested transforms        /// and apply them, even if you don't want them to be applied. Consider        /// the following transform, which will replace the \c _ in        /// <tt>Bar<_>()</tt> with <tt>proto::terminal\<int\>::type</tt>:        ///        /// \code        /// template<typename T>        /// struct Bar        /// {};        ///         /// struct Foo        ///   : proto::when<_, Bar<_>() >        /// {};        ///         /// proto::terminal<int>::type i = {0};        ///         /// int main()        /// {        ///     Foo()(i);        ///     std::cout << typeid(Foo()(i)).name() << std::endl;        /// }        /// \endcode        ///        /// If you actually wanted to default-construct an object of type        /// <tt>Bar\<_\></tt>, you would have to protect the \c _ to prevent        /// it from being applied. You can use <tt>proto::protect\<\></tt>        /// as follows:        ///        /// \code        /// // OK: replace anything with Bar<_>()        /// struct Foo        ///   : proto::when<_, Bar<_>() >        /// {};        /// \endcode        template<typename PrimitiveTransform>        struct protect : transform<protect<PrimitiveTransform> >        {            template<typename, typename, typename>            struct impl            {                typedef PrimitiveTransform result_type;            };        };        /// \brief A PrimitiveTransform which computes a type by evaluating any        /// nested transforms and then constructs an object of that type.        ///        /// The <tt>make\<\></tt> transform checks to see if \c Object is a template.        /// If it is, the template type is disassembled to find nested transforms.        /// Proto considers the following types to represent transforms:        ///        /// \li Function types        /// \li Function pointer types        /// \li Types for which <tt>proto::is_callable\< type \>::::value</tt> is \c true        ///        /// <tt>make\<T\<X0,X1,...\> \>::::result\<void(Expr, State, Data)\>::::type</tt>        /// is evaluated as follows. For each \c X in <tt>X0,X1,...</tt>, do:        ///        /// \li If \c X is a template like <tt>U\<Y0,Y1,...\></tt>, then let <tt>X'</tt>        ///     be <tt>make\<U\<Y0,Y1,...\> \>::::result\<void(Expr, State, Data)\>::::type</tt>

⌨️ 快捷键说明

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