亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? multimethods.h

?? 和modern c++ design 這本書配套的程序庫。可以從作者的網站上免費下載。
?? H
字號:
////////////////////////////////////////////////////////////////////////////////
// The Loki Library
// Copyright (c) 2001 by Andrei Alexandrescu
// This code accompanies the book:
// Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design 
//     Patterns Applied". Copyright (c) 2001. Addison-Wesley.
// Permission to use, copy, modify, distribute and sell this software for any 
//     purpose is hereby granted without fee, provided that the above copyright 
//     notice appear in all copies and that both that copyright notice and this 
//     permission notice appear in supporting documentation.
// The author or Addison-Welsey Longman make no representations about the 
//     suitability of this software for any purpose. It is provided "as is" 
//     without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////

// Last update: June 20, 2001

#ifndef MULTIMETHODS_INC_
#define MULTIMETHODS_INC_

#include "Typelist.h"
#include "TypeInfo.h"
#include "Functor.h"
#include "AssocVector.h"

////////////////////////////////////////////////////////////////////////////////
// IMPORTANT NOTE:
// The double dispatchers implemented below differ from the excerpts shown in
// the book - they are simpler while respecting the same interface.
////////////////////////////////////////////////////////////////////////////////

namespace Loki
{
////////////////////////////////////////////////////////////////////////////////
// class template InvocationTraits (helper)
// Helps implementing optional symmetry
////////////////////////////////////////////////////////////////////////////////

    namespace Private
    {
        template <class SomeLhs, class SomeRhs, 
			class Executor, typename ResultType>
        struct InvocationTraits
        {
            static ResultType 
	    DoDispatch(SomeLhs& lhs, SomeRhs& rhs, 
			Executor& exec, Int2Type<false>)
            {
                return exec.Fire(lhs, rhs);
            }
            static ResultType 
	    DoDispatch(SomeLhs& lhs, SomeRhs& rhs, 
			Executor& exec, Int2Type<true>)
            {
                return exec.Fire(rhs, lhs);
            }
        };
    }

////////////////////////////////////////////////////////////////////////////////
// class template StaticDispatcher
// Implements an automatic static double dispatcher based on two typelists
////////////////////////////////////////////////////////////////////////////////

    template
    <
        class Executor,
        class BaseLhs, 
        class TypesLhs,
        bool symmetric = true,
        class BaseRhs = BaseLhs,
        class TypesRhs = TypesLhs,
        typename ResultType = void
    >
    class StaticDispatcher
    {
        template <class SomeLhs>
        static ResultType DispatchRhs(SomeLhs& lhs, BaseRhs& rhs,
            Executor exec, NullType)
        { return exec.OnError(lhs, rhs); }
        
        template <class TList, class SomeLhs>
        static ResultType DispatchRhs(SomeLhs& lhs, BaseRhs& rhs,
            Executor exec, TList)
        {
            typedef typename TList::Head Head;
            typedef typename TList::Tail Tail;
            
            if (Head* p2 = dynamic_cast<Head*>(&rhs))
            {
                Int2Type<(symmetric &&
                          int(TL::IndexOf<TypesRhs, Head>::value) <
                          int(TL::IndexOf<TypesLhs, SomeLhs>::value))> i2t;

                typedef Private::InvocationTraits< 
                        SomeLhs, Head, Executor, ResultType> CallTraits;
                    
                return CallTraits::DoDispatch(lhs, *p2, exec, i2t);
            }
            return DispatchRhs(lhs, rhs, exec, Tail());
        }
        
        static ResultType DispatchLhs(BaseLhs& lhs, BaseRhs& rhs,
            Executor exec, NullType)
        { return exec.OnError(lhs, rhs); }
        
        template <class TList>
        static ResultType DispatchLhs(BaseLhs& lhs, BaseRhs& rhs,
            Executor exec, TList)
        {
            typedef typename TList::Head Head;
            typedef typename TList::Tail Tail;
            
            if (Head* p1 = dynamic_cast<Head*>(&lhs))
            {
                return DispatchRhs(*p1, rhs, exec, TypesRhs());
            }
            return DispatchLhs(lhs, rhs, exec, Tail());
        }

    public:
        static ResultType Go(BaseLhs& lhs, BaseRhs& rhs,
            Executor exec)
        { return DispatchLhs(lhs, rhs, exec, TypesLhs()); }
    };
    
////////////////////////////////////////////////////////////////////////////////
// class template BasicDispatcher
// Implements a logarithmic double dispatcher for functors (or functions)
// Doesn't offer automated casts or symmetry
////////////////////////////////////////////////////////////////////////////////

    template
    <
        class BaseLhs,
        class BaseRhs = BaseLhs,
        typename ResultType = void,
        typename CallbackType = ResultType (*)(BaseLhs&, BaseRhs&)
    >
    class BasicDispatcher
    {
        typedef std::pair<TypeInfo,TypeInfo> KeyType;
        typedef CallbackType MappedType;
        typedef AssocVector<KeyType, MappedType> MapType;
        MapType callbackMap_;
        
        void DoAdd(TypeInfo lhs, TypeInfo rhs, CallbackType fun);
        bool DoRemove(TypeInfo lhs, TypeInfo rhs);
        
    public:
        template <class SomeLhs, class SomeRhs>
        void Add(CallbackType fun)
        {
            DoAdd(typeid(SomeLhs), typeid(SomeRhs), fun);
        }
        
        template <class SomeLhs, class SomeRhs>
        bool Remove()
        {
            return DoRemove(typeid(SomeLhs), typeid(SomeRhs));
        }
        
        ResultType Go(BaseLhs& lhs, BaseRhs& rhs);
    };

    // Non-inline to reduce compile time overhead...
    template <class BaseLhs, class BaseRhs, 
		typename ResultType, typename CallbackType>
    void BasicDispatcher<BaseLhs,BaseRhs,ResultType,CallbackType>
    	 ::DoAdd(TypeInfo lhs, TypeInfo rhs, CallbackType fun)
    {
        callbackMap_[KeyType(lhs, rhs)] = fun;
    }
        
    template <class BaseLhs, class BaseRhs, 
		typename ResultType, typename CallbackType>
    bool BasicDispatcher<BaseLhs,BaseRhs,ResultType,CallbackType>
         ::DoRemove(TypeInfo lhs, TypeInfo rhs)
    {
        return callbackMap_.erase(KeyType(lhs, rhs)) == 1;
    }

    template <class BaseLhs, class BaseRhs, 
		typename ResultType, typename CallbackType>
    ResultType BasicDispatcher<BaseLhs,BaseRhs,ResultType,CallbackType>
               ::Go(BaseLhs& lhs, BaseRhs& rhs)
    {
    	typename MapType::key_type k(typeid(lhs),typeid(rhs));
        typename MapType::iterator i = callbackMap_.find(k);
        if (i == callbackMap_.end())
        {
                throw std::runtime_error("Function not found");
        }
        return (i->second)(lhs, rhs);
    }

////////////////////////////////////////////////////////////////////////////////
// class template StaticCaster
// Implementation of the CastingPolicy used by FunctorDispatcher
////////////////////////////////////////////////////////////////////////////////

    template <class To, class From>
    struct StaticCaster
    {
        static To& Cast(From& obj)
        {
            return static_cast<To&>(obj);
        }
    };

////////////////////////////////////////////////////////////////////////////////
// class template DynamicCaster
// Implementation of the CastingPolicy used by FunctorDispatcher
////////////////////////////////////////////////////////////////////////////////

    template <class To, class From>
    struct DynamicCaster
    {
        static To& Cast(From& obj)
        {
            return dynamic_cast<To&>(obj);
        }
    };

////////////////////////////////////////////////////////////////////////////////
// class template Private::FnDispatcherHelper
// Implements trampolines and argument swapping used by FnDispatcher
////////////////////////////////////////////////////////////////////////////////

    namespace Private
    {
        template <class BaseLhs, class BaseRhs,
	    class SomeLhs, class SomeRhs,
            typename ResultType,
            class CastLhs, class CastRhs,
            ResultType (*Callback)(SomeLhs&, SomeRhs&)>
        struct FnDispatcherHelper
        {
            static ResultType Trampoline(BaseLhs& lhs, BaseRhs& rhs)
            {
                return Callback(CastLhs::Cast(lhs), CastRhs::Cast(rhs));
            }
            static ResultType TrampolineR(BaseRhs& rhs, BaseLhs& lhs)
            {
                return Trampoline(lhs, rhs);
            }
        };
    }

////////////////////////////////////////////////////////////////////////////////
// class template FnDispatcher
// Implements an automatic logarithmic double dispatcher for functions
// Features automated conversions
////////////////////////////////////////////////////////////////////////////////

    template <class BaseLhs, class BaseRhs = BaseLhs,
              typename ResultType = void,
              template <class, class> class CastingPolicy = DynamicCaster,
              template <class, class, class, class>
              class DispatcherBackend = BasicDispatcher>
    class FnDispatcher
    {
        DispatcherBackend<BaseLhs, BaseRhs, ResultType, 
            ResultType (*)(BaseLhs&, BaseRhs&)> backEnd_;
        
    public:
        template <class SomeLhs, class SomeRhs>
        void Add(ResultType (*pFun)(BaseLhs&, BaseRhs&))
        {
            return backEnd_.Add<SomeLhs, SomeRhs>(pFun);
        }        
        
        template <class SomeLhs, class SomeRhs,
            ResultType (*callback)(SomeLhs&, SomeRhs&)>
        void Add()
        {
	    typedef Private::FnDispatcherHelper<
					BaseLhs, BaseRhs, 
					SomeLhs, SomeRhs,
					ResultType,
					CastingPolicy<SomeLhs,BaseLhs>, 
					CastingPolicy<SomeRhs,BaseRhs>, 
					callback> Local;

            Add<SomeLhs, SomeRhs>(&Local::Trampoline);
        }
        
        template <class SomeLhs, class SomeRhs,
            ResultType (*callback)(SomeLhs&, SomeRhs&),
            bool symmetric>
        void Add()
        {
	    typedef Private::FnDispatcherHelper<
					BaseLhs, BaseRhs, 
					SomeLhs, SomeRhs,
					ResultType,
					CastingPolicy<SomeLhs,BaseLhs>, 
					CastingPolicy<SomeRhs,BaseRhs>, 
					callback> Local;

            Add<SomeLhs, SomeRhs>(&Local::Trampoline);
            if (symmetric)
            {
                Add<SomeRhs, SomeLhs>(&Local::TrampolineR);
            }
        }
        
        template <class SomeLhs, class SomeRhs>
        void Remove()
        {
            backEnd_.Remove<SomeLhs, SomeRhs>();
        }

        ResultType Go(BaseLhs& lhs, BaseRhs& rhs)
        {
            return backEnd_.Go(lhs, rhs);
        }
    };

////////////////////////////////////////////////////////////////////////////////
// class template FunctorDispatcherAdaptor
// permits use of FunctorDispatcher under gcc.2.95.2/3
///////////////////////////////////////////////////////////////////////////////

    namespace Private
    {
	template <class BaseLhs, class BaseRhs,
		  class SomeLhs, class SomeRhs,
		  typename ResultType,
		  class CastLhs, class CastRhs,
		  class Fun, bool SwapArgs>
        class FunctorDispatcherHelper 
        {
            Fun fun_;
            ResultType Fire(BaseLhs& lhs, BaseRhs& rhs,Int2Type<false>)
            {
                return fun_(CastLhs::Cast(lhs), CastRhs::Cast(rhs));
            }
            ResultType Fire(BaseLhs& rhs, BaseRhs& lhs,Int2Type<true>)
            {
                return fun_(CastLhs::Cast(lhs), CastRhs::Cast(rhs));
            }
        public:
            FunctorDispatcherHelper(const Fun& fun) : fun_(fun) {}

            ResultType operator()(BaseLhs& lhs, BaseRhs& rhs)
            {
                return Fire(lhs,rhs,Int2Type<SwapArgs>());
            }
        };
    }

////////////////////////////////////////////////////////////////////////////////
// class template FunctorDispatcher
// Implements a logarithmic double dispatcher for functors
// Features automated casting
////////////////////////////////////////////////////////////////////////////////

    template <class BaseLhs, class BaseRhs = BaseLhs,
              typename ResultType = void,
              template <class, class> class CastingPolicy = DynamicCaster, 
              template <class, class, class, class>
              class DispatcherBackend = BasicDispatcher>
    class FunctorDispatcher
    {
        typedef TYPELIST_2(BaseLhs&, BaseRhs&) ArgsList;
        typedef Functor<ResultType, ArgsList, DEFAULT_THREADING> FunctorType;

        DispatcherBackend<BaseLhs, BaseRhs, ResultType, FunctorType> backEnd_;

    public:
        template <class SomeLhs, class SomeRhs, class Fun>
        void Add(const Fun& fun)
        {
            typedef Private::FunctorDispatcherHelper<
					BaseLhs, BaseRhs,
					SomeLhs, SomeRhs,
					ResultType,
					CastingPolicy<SomeLhs, BaseLhs>,
					CastingPolicy<SomeRhs, BaseRhs>,
					Fun, false> Adapter;

            backEnd_.Add<SomeLhs, SomeRhs>(FunctorType(Adapter(fun)));
	}
        template <class SomeLhs, class SomeRhs, bool symmetric, class Fun>
        void Add(const Fun& fun)
        {
	    Add<SomeLhs,SomeRhs>(fun);

	    if (symmetric)
	    {
		// Note: symmetry only makes sense where BaseLhs==BaseRhs
            	typedef Private::FunctorDispatcherHelper<
					BaseLhs, BaseLhs,
					SomeLhs, SomeRhs,
					ResultType,
					CastingPolicy<SomeLhs, BaseLhs>,
					CastingPolicy<SomeRhs, BaseLhs>,
					Fun, true> AdapterR;

               	backEnd_.Add<SomeRhs, SomeLhs>(FunctorType(AdapterR(fun)));
	    }
        }
        
        template <class SomeLhs, class SomeRhs>
        void Remove()
        {
            backEnd_.Remove<SomeLhs, SomeRhs>();
        }

        ResultType Go(BaseLhs& lhs, BaseRhs& rhs)
        {
            return backEnd_.Go(lhs, rhs);
        }
    };
} // namespace Loki

////////////////////////////////////////////////////////////////////////////////
// Change log:
// June 20, 2001: ported by Nick Thurn to gcc 2.95.3. Kudos, Nick!!!
////////////////////////////////////////////////////////////////////////////////

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆久久久久久久| 欧美视频中文一区二区三区在线观看 | 国产乱色国产精品免费视频| 99精品欧美一区二区三区小说| 欧美日韩另类国产亚洲欧美一级| 欧美激情一区二区三区蜜桃视频| 亚洲成在人线免费| 99久久久久久| 久久婷婷国产综合国色天香| 日韩国产欧美在线播放| 91丝袜呻吟高潮美腿白嫩在线观看| 精品理论电影在线观看 | 99久久伊人久久99| 久久亚洲一区二区三区四区| 日本视频一区二区| 欧美日韩国产天堂| 亚洲一区二区影院| 91久久线看在观草草青青| 国产精品伦理在线| 国产成人综合网站| 久久精品男人的天堂| 精品一区免费av| 91精品国产美女浴室洗澡无遮挡| 亚洲综合图片区| 日本韩国欧美国产| 亚洲综合在线观看视频| 91免费看`日韩一区二区| 国产精品久久久久久亚洲毛片| 国产在线视频一区二区| 精品va天堂亚洲国产| 精品一区二区三区免费毛片爱| 91精品国产免费久久综合| 日韩精品免费专区| 91精品国产色综合久久ai换脸| 亚洲6080在线| 欧美精品v国产精品v日韩精品| 亚洲一级二级三级在线免费观看| 91福利在线观看| 亚洲成av人片在线观看| 欧美色爱综合网| 日韩高清不卡一区二区三区| 欧美一区中文字幕| 色综合久久久久久久久久久| 亚洲精品国产精华液| 日本伦理一区二区| 香蕉影视欧美成人| 精品少妇一区二区| 成人一区二区三区视频在线观看| 亚洲欧洲成人av每日更新| 91黄色免费网站| 日韩中文字幕av电影| 日韩一级免费观看| 国产一区二区三区精品欧美日韩一区二区三区| 精品美女在线播放| 不卡一区二区三区四区| 亚洲欧美日韩国产成人精品影院| 在线精品视频免费播放| 日韩电影在线免费看| 久久综合狠狠综合久久激情| 成人av电影在线| 亚洲超丰满肉感bbw| 精品国产伦一区二区三区免费| 国产69精品久久久久777| 亚洲精品免费视频| 欧美一二三四区在线| 国产suv精品一区二区6| 一区二区在线免费观看| 精品国产乱码久久久久久老虎| 国产成人三级在线观看| 亚洲国产精品久久艾草纯爱| 精品国产一区二区三区久久久蜜月 | 国产精品主播直播| 亚洲精品午夜久久久| 日韩精品最新网址| 91猫先生在线| 国产一区激情在线| 亚洲图片有声小说| 中文字幕精品三区| 91精品麻豆日日躁夜夜躁| 北条麻妃一区二区三区| 日本一道高清亚洲日美韩| 国产精品国产馆在线真实露脸| 91精品国模一区二区三区| 丁香激情综合五月| 精品一区二区三区在线观看国产 | 日韩av一区二区在线影视| 国产精品素人一区二区| 日韩一区国产二区欧美三区| 99re免费视频精品全部| 国产一区欧美日韩| 日韩成人午夜精品| 亚洲永久免费av| 中文字幕日本不卡| 欧美国产日韩亚洲一区| 精品欧美一区二区久久| 欧美日韩免费一区二区三区视频| av午夜一区麻豆| 国产成人在线网站| 国内精品伊人久久久久影院对白| 午夜精品福利在线| 亚洲国产日韩一区二区| 亚洲欧美偷拍另类a∨色屁股| 国产日韩欧美在线一区| 欧美电视剧在线观看完整版| 精品视频一区三区九区| 欧美视频在线一区| 欧美影院一区二区| 在线视频国产一区| 一本到不卡免费一区二区| 99久久国产综合精品色伊| 成人毛片在线观看| 日韩一本二本av| 欧美精品乱码久久久久久按摩| 欧美综合天天夜夜久久| 在线观看亚洲a| 欧美日韩在线三级| 欧美欧美欧美欧美首页| 欧美日本一区二区在线观看| 欧美乱妇23p| 日韩欧美中文一区二区| 91精品国产日韩91久久久久久| 91精品国产免费久久综合| 精品人在线二区三区| 日韩欧美国产综合一区| 久久男人中文字幕资源站| 久久精品一二三| 亚洲欧洲另类国产综合| 亚洲精品中文字幕在线观看| 国产精品久久久久久久久图文区 | 在线日韩av片| 亚洲人成影院在线观看| 亚洲欧美电影一区二区| 一区二区三区蜜桃网| 丝袜美腿一区二区三区| 美日韩一区二区| 国产69精品一区二区亚洲孕妇| 国产69精品一区二区亚洲孕妇| 亚洲人吸女人奶水| 亚洲国产美女搞黄色| 看片的网站亚洲| gogo大胆日本视频一区| 欧美在线视频不卡| 欧美成人高清电影在线| 国产亚洲午夜高清国产拍精品| 国产精品久久久久久妇女6080| 一区二区高清免费观看影视大全| 一区二区欧美精品| 乱中年女人伦av一区二区| 成人午夜在线免费| 在线播放一区二区三区| ww亚洲ww在线观看国产| 亚洲美女视频在线观看| 老司机精品视频线观看86| 成人av资源站| 日韩亚洲欧美在线| 中文字幕日本乱码精品影院| 蜜臀av国产精品久久久久| 成人蜜臀av电影| 欧美一级欧美三级在线观看| 亚洲视频香蕉人妖| 久久99九九99精品| 欧美无人高清视频在线观看| 久久一区二区三区四区| 亚洲成人黄色小说| 白白色亚洲国产精品| 日韩视频在线永久播放| 伊人性伊人情综合网| 国产伦精一区二区三区| 欧美人与z0zoxxxx视频| 国产精品成人一区二区艾草 | 国产精品入口麻豆原神| 日韩精品一二三区| 99久久国产综合精品麻豆| 精品国产精品网麻豆系列| 亚洲国产婷婷综合在线精品| av在线不卡免费看| 国产亚洲综合性久久久影院| 日韩av中文在线观看| 日本福利一区二区| **欧美大码日韩| 夫妻av一区二区| 国产日韩欧美不卡| 久88久久88久久久| 欧美一区二区三区四区高清| 亚洲图片欧美视频| 91国产成人在线| 一区二区三区欧美激情| 91亚洲国产成人精品一区二区三| 久久久久国产精品麻豆| 久久国产精品无码网站| 午夜精品福利一区二区三区av| 欧美日韩亚洲综合在线 | 亚洲欧洲99久久| 国产精品一区二区男女羞羞无遮挡| 日韩一卡二卡三卡国产欧美| 午夜精品久久久久久久99水蜜桃| 欧美三区免费完整视频在线观看| 一区二区三区四区亚洲| 91片在线免费观看| 亚洲精品国产视频|