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

📄 modifier.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
/*=============================================================================    Copyright (c) 2001-2007 Joel de Guzman    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)==============================================================================*/#if !defined(BOOST_SPIRIT_MODIFIER_FEB_05_2007_0259PM)#define BOOST_SPIRIT_MODIFIER_FEB_05_2007_0259PM#include <boost/spirit/home/support/unused.hpp>#include <boost/spirit/home/support/component.hpp>#include <boost/mpl/identity.hpp>#include <boost/mpl/if.hpp>#include <boost/type_traits/is_base_of.hpp>namespace boost { namespace spirit{    ///////////////////////////////////////////////////////////////////////////    //  The modifier is like a set of types. Types can be added (but not     //  removed). The unique feature of the modifier is that addition of    //  types is done using inheritance. Thus, checking for membership    //  involves checking for inheritance. More importantly, because the    //  modifier inherits from a type, the type's members (typedefs,    //  nested structs, etc.), are all visible; unless, of course, if the    //  member is hidden (newer types take priority) or there's ambiguity.    //    //      to add:                     add_modifier<Modifier, T>    //      to test for membership:     is_member_of_modifier<Modifier, T>    //    //  The modifier is used as the "Visitor" in proto transforms to    //  modify the behavior of the expression template building.    ///////////////////////////////////////////////////////////////////////////    template <typename Set = unused_type, typename New = unused_type>    struct modifier : Set, New {};    template <typename Set>    struct modifier<Set, unused_type> : Set {};    template <typename New>    struct modifier<unused_type, New> : New {};    template <>    struct modifier<unused_type, unused_type> {};            template <typename Modifier, typename New>    struct add_modifier    {        typedef typename // add only if New is not a member            mpl::if_<                is_base_of<New, Modifier>              , Modifier              , modifier<Modifier, New>            >::type        type;    };        template <typename Modifier, typename T>    struct is_member_of_modifier : is_base_of<T, Modifier> {};    ///////////////////////////////////////////////////////////////////////////    //  This is the main customization point for hooking into the     //  make_component mechanism for building /modified/ components.    //  The make_component specialization detects modifier Visitors    //  and dispatches to the secondary template make_modified_component    //  for clients to specialize. By default, the modifier is ignored    //  and the control goes back to make_component.    //    //  (see also: component.hpp)    ///////////////////////////////////////////////////////////////////////////    namespace traits    {        template <            typename Domain, typename Director, typename Elements          , typename Modifier, typename Enable = void>        struct make_modified_component :             make_component<Domain, Director, Elements, unused_type>        {        };            template <            typename Domain, typename Director          , typename Elements, typename Set, typename New>        struct make_component<Domain, Director, Elements, modifier<Set, New> >          : make_modified_component<Domain, Director, Elements, modifier<Set, New> >        {        };    }}}#endif

⌨️ 快捷键说明

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