factory.h

来自「C++封装的视频采集代码」· C头文件 代码 · 共 152 行

H
152
字号
////////////////////////////////////////////////////////////////////////////////// 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 FACTORY_INC_#define FACTORY_INC_#include "Utils/excdef.h"//#include "LokiTypeInfo.h"#include "AssocVector.h"//#include <exception>namespace Loki{////////////////////////////////////////////////////////////////////////////////// class template DefaultFactoryError// Manages the "Unknown Type" error in an object factory////////////////////////////////////////////////////////////////////////////////    template <typename IdentifierType, class AbstractProduct>    struct DefaultFactoryError    {        /*        struct Exception : public std::exception        {            const char* what() const THROW() { return "Unknown Type"; }        };        */        static AbstractProduct* OnUnknownType(IdentifierType)        {            //THROW Exception();            return 0;        }    };////////////////////////////////////////////////////////////////////////////////// class template Factory// Implements a generic object factory////////////////////////////////////////////////////////////////////////////////    template    <        class AbstractProduct,         typename IdentifierType,        typename ProductCreator = AbstractProduct* (*)(),        template<typename, class>            class FactoryErrorPolicy = DefaultFactoryError    >    class Factory         : public FactoryErrorPolicy<IdentifierType, AbstractProduct>    {    public:        //typedef ProductCreator ProductCreator; //### added for convenience, Pavel                bool Register(const IdentifierType& id, ProductCreator creator)        {            return associations_.insert(                IdToProductMap::value_type(id, creator)).second;        }                bool Unregister(const IdentifierType& id)        {            return associations_.erase(id) == 1;        }                AbstractProduct* CreateObject(const IdentifierType& id)        {            typename IdToProductMap::iterator i = associations_.find(id);            if (i != associations_.end())            {                return (i->second)();            }            return OnUnknownType(id);        }            private:        typedef AssocVector<IdentifierType, ProductCreator> IdToProductMap;        IdToProductMap associations_;    };////////////////////////////////////////////////////////////////////////////////// class template CloneFactory// Implements a generic cloning factory/////////////////////////////////////////////////////////////////////////////////* ** NEEDS RTTI INFORMATION TO IMPLEMENT CLONE FACTORY    template    <        class AbstractProduct,         class ProductCreator =            AbstractProduct* (*)(const AbstractProduct*),        template<typename, class>            class FactoryErrorPolicy = DefaultFactoryError    >    class CloneFactory        : public FactoryErrorPolicy<TypeInfo, AbstractProduct>    {    public:        //typedef ProductCreator ProductCreator; //### added for convenience, Pavel                bool Register(const TypeInfo& ti, ProductCreator creator)        {            return associations_.insert(                IdToProductMap::value_type(ti, creator)).second;        }                bool Unregister(const TypeInfo& id)        {            return associations_.erase(id) == 1;        }                AbstractProduct* CreateObject(const AbstractProduct* model)        {            if (model == 0) return 0;                        typename IdToProductMap::iterator i =                 associations_.find(typeid(*model));            if (i != associations_.end())            {                return (i->second)(model);            }            return OnUnknownType(typeid(*model));        }            private:        typedef AssocVector<TypeInfo, ProductCreator> IdToProductMap;        IdToProductMap associations_;    };*/} // namespace Loki////////////////////////////////////////////////////////////////////////////////// Change log:// June 20, 2001: ported by Nick Thurn to gcc 2.95.3. Kudos, Nick!!!// May  08, 2002: replaced const_iterator with iterator so that self-modifying//                ProductCreators are supported. Also, added a throw() spec to what().//                Credit due to Jason Fischl.// July 16, 2002: Ported by Terje Sletteb

⌨️ 快捷键说明

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