minimum_category.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 117 行

HPP
117
字号
// Copyright David Abrahams 2003. Use, modification and distribution is// subject to 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 MINIMUM_CATEGORY_DWA20031119_HPP# define MINIMUM_CATEGORY_DWA20031119_HPP# include <boost/type_traits/is_convertible.hpp># include <boost/type_traits/is_same.hpp># include <boost/mpl/aux_/lambda_support.hpp>namespace boost { namespace detail { //// Returns the minimum category type or error_type// if T1 and T2 are unrelated.//// For compilers not supporting is_convertible this only// works with the new boost return and traversal category// types. The exact boost _types_ are required. No derived types// will work. ////template <bool GreaterEqual, bool LessEqual>struct minimum_category_impl# if BOOST_WORKAROUND(BOOST_MSVC, < 1300){    template <class T1, class T2> struct apply    {        typedef T2 type;    };    typedef void type;}# endif ;template <class T1, class T2>struct error_not_related_by_convertibility;  template <>struct minimum_category_impl<true,false>{    template <class T1, class T2> struct apply    {        typedef T2 type;    };};template <>struct minimum_category_impl<false,true>{    template <class T1, class T2> struct apply    {        typedef T1 type;    };};template <>struct minimum_category_impl<true,true>{    template <class T1, class T2> struct apply    {        BOOST_STATIC_ASSERT((is_same<T1,T2>::value));        typedef T1 type;    };};template <>struct minimum_category_impl<false,false>{    template <class T1, class T2> struct apply    : error_not_related_by_convertibility<T1,T2>    {    };};template <class T1 = mpl::_1, class T2 = mpl::_2>struct minimum_category{    typedef minimum_category_impl< # if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // ETI workaround        is_same<T2,int>::value ||# endif         ::boost::is_convertible<T1,T2>::value      , ::boost::is_convertible<T2,T1>::value# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // ETI workaround        || is_same<T1,int>::value# endif     > outer;    typedef typename outer::template apply<T1,T2> inner;    typedef typename inner::type type;          BOOST_MPL_AUX_LAMBDA_SUPPORT(2,minimum_category,(T1,T2))};    template <>struct minimum_category<mpl::_1,mpl::_2>{    template <class T1, class T2>    struct apply : minimum_category<T1,T2>    {};    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,minimum_category,(mpl::_1,mpl::_2))};# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // ETI workaroundtemplate <>struct minimum_category<int,int>{    typedef int type;};# endif    }} // namespace boost::detail#endif // MINIMUM_CATEGORY_DWA20031119_HPP

⌨️ 快捷键说明

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