decltype.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 454 行 · 第 1/2 页
HPP
454 行
////////////////////////////////////////////////////////////////////////////////// \file decltype.hpp/// Contains definition the BOOST_PROTO_DECLTYPE_() macro and assorted helpers//// 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_DETAIL_DECLTYPE_HPP_EAN_04_04_2008#define BOOST_PROTO_DETAIL_DECLTYPE_HPP_EAN_04_04_2008#include <boost/proto/detail/prefix.hpp> // must be first include#include <boost/config.hpp>#include <boost/get_pointer.hpp>#include <boost/preprocessor/cat.hpp>#include <boost/preprocessor/repetition/enum_params.hpp>#include <boost/preprocessor/repetition/enum_binary_params.hpp>#include <boost/preprocessor/repetition/repeat_from_to.hpp>#include <boost/mpl/if.hpp>#include <boost/type_traits/is_class.hpp>#include <boost/type_traits/remove_cv.hpp>#include <boost/type_traits/remove_reference.hpp>#include <boost/type_traits/is_pointer.hpp>#include <boost/type_traits/is_function.hpp>#include <boost/type_traits/is_member_object_pointer.hpp>#include <boost/type_traits/add_const.hpp>#include <boost/type_traits/add_reference.hpp>#include <boost/typeof/typeof.hpp>#include <boost/utility/addressof.hpp>#include <boost/utility/result_of.hpp>#include <boost/utility/enable_if.hpp>#include <boost/proto/detail/suffix.hpp> // must be last include// If we're generating doxygen documentation, hide all the nasty// Boost.Typeof gunk.#ifndef BOOST_PROTO_BUILDING_DOCS# ifdef BOOST_HAS_DECLTYPE# define BOOST_PROTO_DECLTYPE_(EXPR, TYPE) typedef decltype(EXPR) TYPE;# else# define BOOST_PROTO_DECLTYPE_NESTED_TYPEDEF_TPL_(NESTED, EXPR) \ BOOST_TYPEOF_NESTED_TYPEDEF_TPL(BOOST_PP_CAT(nested_and_hidden_, NESTED), EXPR) \ static int const sz = sizeof(boost::proto::detail::check_reference(EXPR)); \ struct NESTED \ : boost::mpl::if_c< \ 1==sz \ , typename BOOST_PP_CAT(nested_and_hidden_, NESTED)::type & \ , typename BOOST_PP_CAT(nested_and_hidden_, NESTED)::type \ > \ {};# define BOOST_PROTO_DECLTYPE_(EXPR, TYPE) \ BOOST_PROTO_DECLTYPE_NESTED_TYPEDEF_TPL_(BOOST_PP_CAT(nested_, TYPE), (EXPR)) \ typedef typename BOOST_PP_CAT(nested_, TYPE)::type TYPE;# endif#else/// INTERNAL ONLY///# define BOOST_PROTO_DECLTYPE_(EXPR, TYPE) \ typedef detail::unspecified TYPE;#endifnamespace boost { namespace proto{ namespace detail { namespace anyns { //////////////////////////////////////////////////////////////////////////////////////////// struct any { any(...); any operator=(any); any operator[](any); #define M0(Z, N, DATA) any operator()(BOOST_PP_ENUM_PARAMS_Z(Z, N, any BOOST_PP_INTERCEPT)); BOOST_PP_REPEAT(BOOST_PROTO_MAX_ARITY, M0, ~) #undef M0 template<typename T> operator T &() const volatile; any operator+(); any operator-(); any operator*(); any operator&(); any operator~(); any operator!(); any operator++(); any operator--(); any operator++(int); any operator--(int); friend any operator<<(any, any); friend any operator>>(any, any); friend any operator*(any, any); friend any operator/(any, any); friend any operator%(any, any); friend any operator+(any, any); friend any operator-(any, any); friend any operator<(any, any); friend any operator>(any, any); friend any operator<=(any, any); friend any operator>=(any, any); friend any operator==(any, any); friend any operator!=(any, any); friend any operator||(any, any); friend any operator&&(any, any); friend any operator&(any, any); friend any operator|(any, any); friend any operator^(any, any); friend any operator,(any, any); friend any operator->*(any, any); friend any operator<<=(any, any); friend any operator>>=(any, any); friend any operator*=(any, any); friend any operator/=(any, any); friend any operator%=(any, any); friend any operator+=(any, any); friend any operator-=(any, any); friend any operator&=(any, any); friend any operator|=(any, any); friend any operator^=(any, any); }; } using anyns::any; //////////////////////////////////////////////////////////////////////////////////////////// template<typename T> struct as_mutable { typedef T &type; }; template<typename T> struct as_mutable<T &> { typedef T &type; }; template<typename T> struct as_mutable<T const &> { typedef T &type; }; //////////////////////////////////////////////////////////////////////////////////////////// template<typename T> T make(); //////////////////////////////////////////////////////////////////////////////////////////// template<typename T> typename as_mutable<T>::type make_mutable(); //////////////////////////////////////////////////////////////////////////////////////////// template<typename T> struct subscript_wrapper : T { using T::operator[]; any operator[](any) const volatile; }; //////////////////////////////////////////////////////////////////////////////////////////// template<typename T> struct as_subscriptable { typedef typename mpl::if_c< is_class<T>::value , subscript_wrapper<T> , T >::type type; }; template<typename T> struct as_subscriptable<T const> { typedef typename mpl::if_c< is_class<T>::value , subscript_wrapper<T> const , T const >::type type; }; template<typename T> struct as_subscriptable<T &> { typedef typename mpl::if_c< is_class<T>::value , subscript_wrapper<T> & , T & >::type type; }; template<typename T> struct as_subscriptable<T const &> { typedef typename mpl::if_c< is_class<T>::value , subscript_wrapper<T> const & , T const & >::type type; }; //////////////////////////////////////////////////////////////////////////////////////////// template<typename T> typename as_subscriptable<T>::type make_subscriptable(); //////////////////////////////////////////////////////////////////////////////////////////// template<typename T> char check_reference(T &); template<typename T> char (&check_reference(T const &))[2]; namespace has_get_pointer_ { using boost::get_pointer; void *(&get_pointer(...))[2];
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?