📄 substitute.hpp
字号:
#if !defined(BOOST_PP_IS_ITERATING)///// header body//-----------------------------------------------------------------------------// boost variant/detail/substitute.hpp header file// See http://www.boost.org for updates, documentation, and revision history.//-----------------------------------------------------------------------------//// Copyright (c) 2003// Eric Friedman//// 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_VARIANT_DETAIL_SUBSTITUTE_HPP#define BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP#include "boost/mpl/aux_/config/ctps.hpp"#include "boost/variant/detail/substitute_fwd.hpp"#include "boost/mpl/aux_/lambda_arity_param.hpp"#include "boost/mpl/aux_/preprocessor/params.hpp"#include "boost/mpl/aux_/preprocessor/repeat.hpp"#include "boost/mpl/int_fwd.hpp"#include "boost/mpl/limits/arity.hpp"#include "boost/preprocessor/cat.hpp"#include "boost/preprocessor/empty.hpp"#include "boost/preprocessor/arithmetic/inc.hpp"#include "boost/preprocessor/iterate.hpp"namespace boost {namespace detail { namespace variant {#if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)///////////////////////////////////////////////////////////////////////////////// (detail) metafunction substitute//// Substitutes one type for another in the given type expression.////// primary template//template < typename T, typename Dest, typename Source BOOST_MPL_AUX_LAMBDA_ARITY_PARAM( typename Arity /* = ... (see substitute_fwd.hpp) */ ) >struct substitute{ typedef T type;};//// tag substitution specializations//#define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(CV_) \ template <typename Dest, typename Source> \ struct substitute< \ CV_ Source \ , Dest \ , Source \ BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \ > \ { \ typedef CV_ Dest type; \ }; \ /**/BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG( BOOST_PP_EMPTY() )BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const)BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(volatile)BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const volatile)#undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG//// pointer specializations//#define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(CV_) \ template <typename T, typename Dest, typename Source> \ struct substitute< \ T * CV_ \ , Dest \ , Source \ BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \ > \ { \ typedef typename substitute< \ T, Dest, Source \ >::type * CV_ type; \ }; \ /**/BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER( BOOST_PP_EMPTY() )BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const)BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(volatile)BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const volatile)#undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER//// reference specializations//template <typename T, typename Dest, typename Source>struct substitute< T& , Dest , Source BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) >{ typedef typename substitute< T, Dest, Source >::type & type;};//// template expression (i.e., F<...>) specializations//#define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL(N) \ typedef typename substitute< \ BOOST_PP_CAT(U,N), Dest, Source \ >::type BOOST_PP_CAT(u,N); \ /**/#define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF(z, N, _) \ BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL( BOOST_PP_INC(N) ) \ /**/#define BOOST_PP_ITERATION_LIMITS (0,BOOST_MPL_LIMIT_METAFUNCTION_ARITY)#define BOOST_PP_FILENAME_1 "boost/variant/detail/substitute.hpp"#include BOOST_PP_ITERATE()#undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL#undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF#endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)}} // namespace detail::variant} // namespace boost#endif // BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP///// iteration, depth == 1#elif BOOST_PP_ITERATION_DEPTH() == 1#define i BOOST_PP_FRAME_ITERATION(1)#if i > 0//// template specializations//template < template < BOOST_MPL_PP_PARAMS(i,typename P) > class T , BOOST_MPL_PP_PARAMS(i,typename U) , typename Dest , typename Source >struct substitute< T< BOOST_MPL_PP_PARAMS(i,U) > , Dest , Source BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<( i )>) >{private: BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)public: typedef T< BOOST_MPL_PP_PARAMS(i,u) > type;};//// function specializations//template < typename R , BOOST_MPL_PP_PARAMS(i,typename U) , typename Dest , typename Source >struct substitute< R (*)( BOOST_MPL_PP_PARAMS(i,U) ) , Dest , Source BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) >{private: typedef typename substitute< R, Dest, Source >::type r; BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)public: typedef r (*type)( BOOST_MPL_PP_PARAMS(i,u) );};#elif i == 0//// zero-arg function specialization//template < typename R, typename Dest, typename Source >struct substitute< R (*)( void ) , Dest , Source BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) >{private: typedef typename substitute< R, Dest, Source >::type r;public: typedef r (*type)( void );};#endif // i#undef i#endif // BOOST_PP_IS_ITERATING
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -