📄 functional.hpp
字号:
{}; // partial specialization that promotes the arguments to double for // integral division. template<typename Left, typename Right> struct average_base<Left, Right, typename enable_if<are_integral<Left, Right> >::type> : functional::divides<double const, double const> {}; template<typename To, typename From, typename EnableIf> struct promote_base : std::unary_function<From, To> { To operator ()(From &from) const { return from; } }; template<typename ToFrom> struct promote_base<ToFrom, ToFrom, void> : std::unary_function<ToFrom, ToFrom> { ToFrom &operator ()(ToFrom &tofrom) { return tofrom; } }; template<typename Arg, typename EnableIf> struct as_min_base : std::unary_function<Arg, typename remove_const<Arg>::type> { typename remove_const<Arg>::type operator ()(Arg &) const { return (std::numeric_limits<typename remove_const<Arg>::type>::min)(); } }; template<typename Arg> struct as_min_base<Arg, typename enable_if<is_floating_point<Arg> >::type> : std::unary_function<Arg, typename remove_const<Arg>::type> { typename remove_const<Arg>::type operator ()(Arg &) const { return -(std::numeric_limits<typename remove_const<Arg>::type>::max)(); } }; template<typename Arg, typename EnableIf> struct as_max_base : std::unary_function<Arg, typename remove_const<Arg>::type> { typename remove_const<Arg>::type operator ()(Arg &) const { return (std::numeric_limits<typename remove_const<Arg>::type>::max)(); } }; template<typename Arg, typename EnableIf> struct as_zero_base : std::unary_function<Arg, typename remove_const<Arg>::type> { typename remove_const<Arg>::type operator ()(Arg &) const { return numeric::zero<typename remove_const<Arg>::type>::value; } }; template<typename Arg, typename EnableIf> struct as_one_base : std::unary_function<Arg, typename remove_const<Arg>::type> { typename remove_const<Arg>::type operator ()(Arg &) const { return numeric::one<typename remove_const<Arg>::type>::value; } }; template<typename To, typename From, typename ToTag, typename FromTag> struct promote : promote_base<To, From, void> {}; template<typename Left, typename Right, typename LeftTag, typename RightTag> struct min_assign : min_assign_base<Left, Right, void> {}; template<typename Left, typename Right, typename LeftTag, typename RightTag> struct max_assign : max_assign_base<Left, Right, void> {}; template<typename Left, typename Right, typename LeftTag, typename RightTag> struct average : average_base<Left, Right, void> {}; template<typename Arg, typename Tag> struct as_min : as_min_base<Arg, void> {}; template<typename Arg, typename Tag> struct as_max : as_max_base<Arg, void> {}; template<typename Arg, typename Tag> struct as_zero : as_zero_base<Arg, void> {}; template<typename Arg, typename Tag> struct as_one : as_one_base<Arg, void> {}; } namespace op { template<typename To> struct promote : boost::detail::function1<functional::promote<To, _, typename functional::tag<To>::type, functional::tag<_> > > {}; struct min_assign : boost::detail::function2<functional::min_assign<_1, _2, functional::tag<_1>, functional::tag<_2> > > {}; struct max_assign : boost::detail::function2<functional::max_assign<_1, _2, functional::tag<_1>, functional::tag<_2> > > {}; struct average : boost::detail::function2<functional::average<_1, _2, functional::tag<_1>, functional::tag<_2> > > {}; struct as_min : boost::detail::function1<functional::as_min<_, functional::tag<_> > > {}; struct as_max : boost::detail::function1<functional::as_max<_, functional::tag<_> > > {}; struct as_zero : boost::detail::function1<functional::as_zero<_, functional::tag<_> > > {}; struct as_one : boost::detail::function1<functional::as_one<_, functional::tag<_> > > {}; } namespace { op::min_assign const &min_assign = boost::detail::pod_singleton<op::min_assign>::instance; op::max_assign const &max_assign = boost::detail::pod_singleton<op::max_assign>::instance; op::average const &average = boost::detail::pod_singleton<op::average>::instance; op::as_min const &as_min = boost::detail::pod_singleton<op::as_min>::instance; op::as_max const &as_max = boost::detail::pod_singleton<op::as_max>::instance; op::as_zero const &as_zero = boost::detail::pod_singleton<op::as_zero>::instance; op::as_one const &as_one = boost::detail::pod_singleton<op::as_one>::instance; } /////////////////////////////////////////////////////////////////////////////// // promote template<typename To, typename From> typename lazy_disable_if<is_const<From>, mpl::if_<is_same<To, From>, To &, To> >::type promote(From &from) { return functional::promote<To, From>()(from); } template<typename To, typename From> typename mpl::if_<is_same<To const, From const>, To const &, To const>::type promote(From const &from) { return functional::promote<To const, From const>()(from); } template<typename T> struct default_ { typedef default_ type; typedef T value_type; static T const value; operator T const & () const { return default_::value; } }; template<typename T> T const default_<T>::value = T(); template<typename T> struct one { typedef one type; typedef T value_type; static T const value; operator T const & () const { return one::value; } }; template<typename T> T const one<T>::value = T(1); template<typename T> struct zero { typedef zero type; typedef T value_type; static T const value; operator T const & () const { return zero::value; } }; template<typename T> T const zero<T>::value = T(); template<typename T> struct one_or_default : mpl::if_<is_empty<T>, default_<T>, one<T> >::type {}; template<typename T> struct zero_or_default : mpl::if_<is_empty<T>, default_<T>, zero<T> >::type {};}} // namespace boost::numeric#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -