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

📄 operators.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
📖 第 1 页 / 共 2 页
字号:
#define BOOST_PROTO_DEFINE_BINARY_OPERATOR(OP, TAG)                                                 \    template<typename Left, typename Right>                                                         \    inline typename detail::as_expr_if<TAG, Left, Right>::type const                                \    operator OP(Left &left, Right &right)                                                           \    {                                                                                               \        return detail::as_expr_if<TAG, Left, Right>::make(left, right);                             \    }                                                                                               \    template<typename Left, typename Right>                                                         \    inline typename detail::as_expr_if<TAG, Left, Right const>::type const                          \    operator OP(Left &left, Right const &right)                                                     \    {                                                                                               \        return detail::as_expr_if<TAG, Left, Right const>::make(left, right);                       \    }                                                                                               \    template<typename Left, typename Right>                                                         \    inline typename detail::as_expr_if<TAG, Left const, Right>::type const                          \    operator OP(Left const &left, Right &right)                                                     \    {                                                                                               \        return detail::as_expr_if<TAG, Left const, Right>::make(left, right);                       \    }                                                                                               \    template<typename Left, typename Right>                                                         \    inline typename detail::as_expr_if<TAG, Left const, Right const>::type const                    \    operator OP(Left const &left, Right const &right)                                               \    {                                                                                               \        return detail::as_expr_if<TAG, Left const, Right const>::make(left, right);                 \    }                                                                                               \    /**/    namespace exprns_    {        BOOST_PROTO_DEFINE_UNARY_OPERATOR(+, tag::posit, 0)        BOOST_PROTO_DEFINE_UNARY_OPERATOR(-, tag::negate, 0)        BOOST_PROTO_DEFINE_UNARY_OPERATOR(*, tag::dereference, 0)        BOOST_PROTO_DEFINE_UNARY_OPERATOR(~, tag::complement, 0)        BOOST_PROTO_DEFINE_UNARY_OPERATOR(&, tag::address_of, 0)        BOOST_PROTO_DEFINE_UNARY_OPERATOR(!, tag::logical_not, 0)        BOOST_PROTO_DEFINE_UNARY_OPERATOR(++, tag::pre_inc, 0)        BOOST_PROTO_DEFINE_UNARY_OPERATOR(--, tag::pre_dec, 0)        BOOST_PROTO_DEFINE_UNARY_OPERATOR(++, tag::post_inc, 1)        BOOST_PROTO_DEFINE_UNARY_OPERATOR(--, tag::post_dec, 1)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(<<, tag::shift_left)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(>>, tag::shift_right)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(*, tag::multiplies)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(/, tag::divides)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(%, tag::modulus)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(+, tag::plus)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(-, tag::minus)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(<, tag::less)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(>, tag::greater)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(<=, tag::less_equal)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(>=, tag::greater_equal)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(==, tag::equal_to)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(!=, tag::not_equal_to)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(||, tag::logical_or)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(&&, tag::logical_and)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(&, tag::bitwise_and)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(|, tag::bitwise_or)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(^, tag::bitwise_xor)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(BOOST_PP_COMMA(), tag::comma)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(->*, tag::mem_ptr)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(<<=, tag::shift_left_assign)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(>>=, tag::shift_right_assign)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(*=, tag::multiplies_assign)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(/=, tag::divides_assign)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(%=, tag::modulus_assign)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(+=, tag::plus_assign)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(-=, tag::minus_assign)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(&=, tag::bitwise_and_assign)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(|=, tag::bitwise_or_assign)        BOOST_PROTO_DEFINE_BINARY_OPERATOR(^=, tag::bitwise_xor_assign)        /// if_else        ///        BOOST_PROTO_DEFINE_FUNCTION_TEMPLATE(            3          , if_else          , deduce_domain          , (tag::if_else_)          , BOOST_PP_SEQ_NIL        )    } // exprns_    using exprns_::if_else;#undef BOOST_PROTO_DEFINE_UNARY_OPERATOR#undef BOOST_PROTO_DEFINE_BINARY_OPERATOR#define BOOST_PROTO_DEFINE_UNARY_OPERATOR(OP, TAG, TRAIT, DOMAIN, POST)                             \    template<typename Arg>                                                                          \    typename boost::proto::detail::enable_unary<DOMAIN, TRAIT<Arg>, Arg                             \        , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Arg &>::type                     \    >::type const                                                                                   \    operator OP(Arg &arg BOOST_PROTO_UNARY_OP_IS_POSTFIX_ ## POST)                                  \    {                                                                                               \        return boost::proto::make_expr<TAG, DOMAIN>(boost::ref(arg));                               \    }                                                                                               \    template<typename Arg>                                                                          \    typename boost::proto::detail::enable_unary<DOMAIN, TRAIT<Arg>, Arg                             \        , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Arg const &>::type               \    >::type const                                                                                   \    operator OP(Arg const &arg BOOST_PROTO_UNARY_OP_IS_POSTFIX_ ## POST)                            \    {                                                                                               \        return boost::proto::make_expr<TAG, DOMAIN>(boost::ref(arg));                               \    }                                                                                               \    /**/#define BOOST_PROTO_DEFINE_BINARY_OPERATOR(OP, TAG, TRAIT, DOMAIN)                                  \    template<typename Left, typename Right>                                                         \    typename boost::proto::detail::enable_binary<DOMAIN, TRAIT<Left>, Left, TRAIT<Right>, Right     \        , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Left &, Right &>::type           \    >::type const                                                                                   \    operator OP(Left &left, Right &right)                                                           \    {                                                                                               \        return boost::proto::make_expr<TAG, DOMAIN>(boost::ref(left), boost::ref(right));           \    }                                                                                               \    template<typename Left, typename Right>                                                         \    typename boost::proto::detail::enable_binary<DOMAIN, TRAIT<Left>, Left, TRAIT<Right>, Right     \        , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Left &, Right const &>::type     \    >::type const                                                                                   \    operator OP(Left &left, Right const &right)                                                     \    {                                                                                               \        return boost::proto::make_expr<TAG, DOMAIN>(boost::ref(left), boost::ref(right));           \    }                                                                                               \    template<typename Left, typename Right>                                                         \    typename boost::proto::detail::enable_binary<DOMAIN, TRAIT<Left>, Left, TRAIT<Right>, Right     \        , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Left const &, Right &>::type     \    >::type const                                                                                   \    operator OP(Left const &left, Right &right)                                                     \    {                                                                                               \        return boost::proto::make_expr<TAG, DOMAIN>(boost::ref(left), boost::ref(right));           \    }                                                                                               \    template<typename Left, typename Right>                                                         \    typename boost::proto::detail::enable_binary<DOMAIN, TRAIT<Left>, Left, TRAIT<Right>, Right     \        , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Left const &, Right const &>::type\    >::type const                                                                                   \    operator OP(Left const &left, Right const &right)                                               \    {                                                                                               \        return boost::proto::make_expr<TAG, DOMAIN>(boost::ref(left), boost::ref(right));           \    }                                                                                               \    /**/#define BOOST_PROTO_DEFINE_OPERATORS(TRAIT, DOMAIN)                                                 \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(+, boost::proto::tag::posit, TRAIT, DOMAIN, 0)                \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(-, boost::proto::tag::negate, TRAIT, DOMAIN, 0)               \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(*, boost::proto::tag::dereference, TRAIT, DOMAIN, 0)          \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(~, boost::proto::tag::complement, TRAIT, DOMAIN, 0)           \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(&, boost::proto::tag::address_of, TRAIT, DOMAIN, 0)           \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(!, boost::proto::tag::logical_not, TRAIT, DOMAIN, 0)          \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(++, boost::proto::tag::pre_inc, TRAIT, DOMAIN, 0)             \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(--, boost::proto::tag::pre_dec, TRAIT, DOMAIN, 0)             \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(++, boost::proto::tag::post_inc, TRAIT, DOMAIN, 1)            \    BOOST_PROTO_DEFINE_UNARY_OPERATOR(--, boost::proto::tag::post_dec, TRAIT, DOMAIN, 1)            \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(<<, boost::proto::tag::shift_left, TRAIT, DOMAIN)            \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(>>, boost::proto::tag::shift_right, TRAIT, DOMAIN)           \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(*, boost::proto::tag::multiplies, TRAIT, DOMAIN)             \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(/, boost::proto::tag::divides, TRAIT, DOMAIN)                \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(%, boost::proto::tag::modulus, TRAIT, DOMAIN)                \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(+, boost::proto::tag::plus, TRAIT, DOMAIN)                   \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(-, boost::proto::tag::minus, TRAIT, DOMAIN)                  \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(<, boost::proto::tag::less, TRAIT, DOMAIN)                   \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(>, boost::proto::tag::greater, TRAIT, DOMAIN)                \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(<=, boost::proto::tag::less_equal, TRAIT, DOMAIN)            \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(>=, boost::proto::tag::greater_equal, TRAIT, DOMAIN)         \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(==, boost::proto::tag::equal_to, TRAIT, DOMAIN)              \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(!=, boost::proto::tag::not_equal_to, TRAIT, DOMAIN)          \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(||, boost::proto::tag::logical_or, TRAIT, DOMAIN)            \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(&&, boost::proto::tag::logical_and, TRAIT, DOMAIN)           \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(&, boost::proto::tag::bitwise_and, TRAIT, DOMAIN)            \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(|, boost::proto::tag::bitwise_or, TRAIT, DOMAIN)             \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(^, boost::proto::tag::bitwise_xor, TRAIT, DOMAIN)            \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(BOOST_PP_COMMA(), boost::proto::tag::comma, TRAIT, DOMAIN)   \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(->*, boost::proto::tag::mem_ptr, TRAIT, DOMAIN)              \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(<<=, boost::proto::tag::shift_left_assign, TRAIT, DOMAIN)    \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(>>=, boost::proto::tag::shift_right_assign, TRAIT, DOMAIN)   \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(*=, boost::proto::tag::multiplies_assign, TRAIT, DOMAIN)     \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(/=, boost::proto::tag::divides_assign, TRAIT, DOMAIN)        \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(%=, boost::proto::tag::modulus_assign, TRAIT, DOMAIN)        \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(+=, boost::proto::tag::plus_assign, TRAIT, DOMAIN)           \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(-=, boost::proto::tag::minus_assign, TRAIT, DOMAIN)          \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(&=, boost::proto::tag::bitwise_and_assign, TRAIT, DOMAIN)    \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(|=, boost::proto::tag::bitwise_or_assign, TRAIT, DOMAIN)     \    BOOST_PROTO_DEFINE_BINARY_OPERATOR(^=, boost::proto::tag::bitwise_xor_assign, TRAIT, DOMAIN)    \    /**/    template<typename T>    struct is_extension      : mpl::false_    {};    #ifndef BOOST_PROTO_DOXYGEN_INVOKED    namespace exops    {        BOOST_PROTO_DEFINE_OPERATORS(is_extension, default_domain)        using proto::if_else;    }    #endif}}#endif

⌨️ 快捷键说明

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