functor.h

来自「C++封装的视频采集代码」· C头文件 代码 · 共 1,153 行 · 第 1/4 页

H
1,153
字号
////////////////////////////////////////////////////////////////////////////////// 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-Wesley 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: August 9, 2002#ifndef FUNCTOR_INC_#define FUNCTOR_INC_#include "Typelist.h"#include "EmptyType.h"#include "SmallObj.h"#include "TypeTraits.h"#include <typeinfo>#include <memory>namespace Loki{////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl (internal)////////////////////////////////////////////////////////////////////////////////    namespace Private    {        template <typename R, template <class> class ThreadingModel>        struct FunctorImplBase : public SmallObject<ThreadingModel>        {            typedef R ResultType;                        typedef EmptyType Parm1;            typedef EmptyType Parm2;            typedef EmptyType Parm3;            typedef EmptyType Parm4;            typedef EmptyType Parm5;            typedef EmptyType Parm6;            typedef EmptyType Parm7;            typedef EmptyType Parm8;            typedef EmptyType Parm9;            typedef EmptyType Parm10;            typedef EmptyType Parm11;            typedef EmptyType Parm12;            typedef EmptyType Parm13;            typedef EmptyType Parm14;            typedef EmptyType Parm15;            virtual FunctorImplBase* DoClone() const = 0;            template <class U>            static U* Clone(U* pObj)            {                if (!pObj) return 0;                U* pClone = static_cast<U*>(pObj->DoClone());                ASSERT(typeid(*pClone) == typeid(*pObj));                return pClone;            }        };    }    ////////////////////////////////////////////////////////////////////////////////// macro DEFINE_CLONE_FUNCTORIMPL// Implements the DoClone function for a functor implementation////////////////////////////////////////////////////////////////////////////////#define DEFINE_CLONE_FUNCTORIMPL(Cls) \    virtual Cls* DoClone() const { return new Cls(*this); }////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// The base class for a hierarchy of functors. The FunctorImpl class is not used//     directly; rather, the Functor class manages and forwards to a pointer to//     FunctorImpl// You may want to derive your own functors from FunctorImpl.// Specializations of FunctorImpl for up to 15 parameters follow////////////////////////////////////////////////////////////////////////////////    template <typename R, class TList,         template <class> class ThreadingModel = DEFAULT_THREADING>    class FunctorImpl;////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 0 (zero) parameters////////////////////////////////////////////////////////////////////////////////    template <typename R, template <class> class ThreadingModel>    class FunctorImpl<R, NullType, ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        virtual R operator()() = 0;    };////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 1 parameter////////////////////////////////////////////////////////////////////////////////    template <typename R, typename P1, template <class> class ThreadingModel>    class FunctorImpl<R, TYPELIST_1(P1), ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        typedef typename TypeTraits<P1>::ParameterType Parm1;        virtual R operator()(Parm1) = 0;    };////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 2 parameters////////////////////////////////////////////////////////////////////////////////    template <typename R, typename P1, typename P2,         template <class> class ThreadingModel>    class FunctorImpl<R, TYPELIST_2(P1, P2), ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        typedef typename TypeTraits<P1>::ParameterType Parm1;        typedef typename TypeTraits<P2>::ParameterType Parm2;        virtual R operator()(Parm1, Parm2) = 0;    };////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 3 parameters////////////////////////////////////////////////////////////////////////////////    template <typename R, typename P1, typename P2, typename P3,        template <class> class ThreadingModel>    class FunctorImpl<R, TYPELIST_3(P1, P2, P3), ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        typedef typename TypeTraits<P1>::ParameterType Parm1;        typedef typename TypeTraits<P2>::ParameterType Parm2;        typedef typename TypeTraits<P3>::ParameterType Parm3;        virtual R operator()(Parm1, Parm2, Parm3) = 0;    };////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 4 parameters////////////////////////////////////////////////////////////////////////////////    template <typename R, typename P1, typename P2, typename P3, typename P4,        template <class> class ThreadingModel>    class FunctorImpl<R, TYPELIST_4(P1, P2, P3, P4), ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        typedef typename TypeTraits<P1>::ParameterType Parm1;        typedef typename TypeTraits<P2>::ParameterType Parm2;        typedef typename TypeTraits<P3>::ParameterType Parm3;        typedef typename TypeTraits<P4>::ParameterType Parm4;        virtual R operator()(Parm1, Parm2, Parm3, Parm4) = 0;    };////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 5 parameters////////////////////////////////////////////////////////////////////////////////    template <typename R, typename P1, typename P2, typename P3, typename P4,        typename P5,        template <class> class ThreadingModel>    class FunctorImpl<R, TYPELIST_5(P1, P2, P3, P4, P5), ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        typedef typename TypeTraits<P1>::ParameterType Parm1;        typedef typename TypeTraits<P2>::ParameterType Parm2;        typedef typename TypeTraits<P3>::ParameterType Parm3;        typedef typename TypeTraits<P4>::ParameterType Parm4;        typedef typename TypeTraits<P5>::ParameterType Parm5;        virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5) = 0;    };////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 6 parameters////////////////////////////////////////////////////////////////////////////////    template <typename R, typename P1, typename P2, typename P3, typename P4,        typename P5, typename P6,        template <class> class ThreadingModel>    class FunctorImpl<R, TYPELIST_6(P1, P2, P3, P4, P5, P6), ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        typedef typename TypeTraits<P1>::ParameterType Parm1;        typedef typename TypeTraits<P2>::ParameterType Parm2;        typedef typename TypeTraits<P3>::ParameterType Parm3;        typedef typename TypeTraits<P4>::ParameterType Parm4;        typedef typename TypeTraits<P5>::ParameterType Parm5;        typedef typename TypeTraits<P6>::ParameterType Parm6;        virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6) = 0;    };////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 7 parameters////////////////////////////////////////////////////////////////////////////////    template <typename R, typename P1, typename P2, typename P3, typename P4,        typename P5, typename P6, typename P7,        template <class> class ThreadingModel>    class FunctorImpl<R, TYPELIST_7(P1, P2, P3, P4, P5, P6, P7), ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        typedef typename TypeTraits<P1>::ParameterType Parm1;        typedef typename TypeTraits<P2>::ParameterType Parm2;        typedef typename TypeTraits<P3>::ParameterType Parm3;        typedef typename TypeTraits<P4>::ParameterType Parm4;        typedef typename TypeTraits<P5>::ParameterType Parm5;        typedef typename TypeTraits<P6>::ParameterType Parm6;        typedef typename TypeTraits<P7>::ParameterType Parm7;        virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,             Parm7) = 0;    };////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 8 parameters////////////////////////////////////////////////////////////////////////////////    template <typename R, typename P1, typename P2, typename P3, typename P4,        typename P5, typename P6, typename P7, typename P8,        template <class> class ThreadingModel>    class FunctorImpl<R, TYPELIST_8(P1, P2, P3, P4, P5, P6, P7, P8),            ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        typedef typename TypeTraits<P1>::ParameterType Parm1;        typedef typename TypeTraits<P2>::ParameterType Parm2;        typedef typename TypeTraits<P3>::ParameterType Parm3;        typedef typename TypeTraits<P4>::ParameterType Parm4;        typedef typename TypeTraits<P5>::ParameterType Parm5;        typedef typename TypeTraits<P6>::ParameterType Parm6;        typedef typename TypeTraits<P7>::ParameterType Parm7;        typedef typename TypeTraits<P8>::ParameterType Parm8;        virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6,             Parm7, Parm8) = 0;    };////////////////////////////////////////////////////////////////////////////////// class template FunctorImpl// Specialization for 9 parameters////////////////////////////////////////////////////////////////////////////////    template <typename R, typename P1, typename P2, typename P3, typename P4,        typename P5, typename P6, typename P7, typename P8, typename P9,        template <class> class ThreadingModel>    class FunctorImpl<R, TYPELIST_9(P1, P2, P3, P4, P5, P6, P7, P8, P9),            ThreadingModel>        : public Private::FunctorImplBase<R, ThreadingModel>    {    public:        typedef R ResultType;        typedef typename TypeTraits<P1>::ParameterType Parm1;        typedef typename TypeTraits<P2>::ParameterType Parm2;        typedef typename TypeTraits<P3>::ParameterType Parm3;        typedef typename TypeTraits<P4>::ParameterType Parm4;        typedef typename TypeTraits<P5>::ParameterType Parm5;        typedef typename TypeTraits<P6>::ParameterType Parm6;        typedef typename TypeTraits<P7>::ParameterType Parm7;        typedef typename TypeTraits<P8>::ParameterType Parm8;        typedef typename TypeTraits<P9>::ParameterType Parm9;        virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, 

⌨️ 快捷键说明

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