gpt4 book ai didi

c++派生类型的自动工厂注册

转载 作者:IT老高 更新时间:2023-10-28 22:21:24 24 4
gpt4 key购买 nike

像我之前的许多人一样,我正在尝试让我的派生类型自动注册到我的工厂。我通读了许多问题,并试图专注于我在那里没有找到的内容。

除了自动注册之外,我的一切都运行良好。

我的目标:

  1. 自动注册我的基类Base的任何派生类
    1. 仅我标记为可注册的类(class)
    2. 不仅是 Base 的直接子类
      • 例如: 底座 -> 设备 -> 摄像头 -> 网络摄像头
      • 这将使使用 CRTPthis question 中所述难
  2. 对我想要注册的类(class)进行最小的更改 - 假人证明
  3. 宁愿使用注册器类而不是宏

我有什么:

template <class T>
class abstract_factory
{
public:
template < typename Tsub > static void register_class();
static T* create( const std::string& name );
private:
// allocator<T> is a helper class to create a pointer of correct type
static std::map<std::string, boost::shared_ptr<allocator<T> > > s_map;
};
  • 模板化抽象工厂,std::string 作为键类型
  • 抽象工厂拥有所有成员和方法静态
  • 类名用typeid自动恢复(注册时不需要文字名)
  • 调用注册:abstract_factory<Base>::register_class<MyDerived>();

我尝试过(或想要但不知道如何正确):

  • registrator<Derived> class : 在 Derived.cpp 中静态实例化的模板化类并应调用 abstract_factory::register_class<Derived>()在它的构造函数中
    • 永远不会被调用或实例化
    • 如果我创建 Derived 的实例在 main()这行得通->虽然有点违背了目的
  • 在每个 Derived.hpp 中声明一个简单的静态变量并用Derived.cpp中的静态注册方式设置-> 再次,永远不会被调用。
  • 制作 abstract_factory一个真正的单例,而不是让一切都是静态的?

可以使用任何建议,无论大小,thanx。

最佳答案

我使用单例和成员(member)进行注册,基本上:

template< typename KeyType, typename ProductCreatorType >
class Factory
{
typedef boost::unordered_map< KeyType, ProductCreatorType > CreatorMap;
...
};

使用 Loki,我得到了一些类似的东西:

 typedef Loki::SingletonHolder< Factory< StringHash, boost::function< boost::shared_ptr< SomeBase >( const SomeSource& ) > >, Loki::CreateStatic > SomeFactory;

注册通常使用宏来完成,例如:

#define REGISTER_SOME_FACTORY( type ) static bool BOOST_PP_CAT( type, __regged ) = SomeFactory::Instance().RegisterCreator( BOOST_PP_STRINGIZE( type ), boost::bind( &boost::make_shared< type >, _1 ) );

这种设置有很多优点:

  • 适用于例如 boost::shared_ptr<>。
  • 不需要为所有注册需求维护一个巨大的文件。
  • 对创作者非常灵活,一切顺利。
  • 宏涵盖最常见的用例,同时为替代方案敞开大门。

然后在 .cpp 文件中调用宏就足以在静态初始化期间获得在启动时注册的类型。当类型注册是静态库的一部分时,这很有效,在这种情况下,它不会包含在您的二进制文件中。我见过的将注册编译为库的一部分的唯一解决方案是拥有一个巨大的文件,该文件显式地进行注册,作为某种初始化例程的一部分。相反,我现在所做的是拥有一个包含我的 lib 的客户端文件夹,用户将其作为二进制构建的一部分包含在内。

根据您的要求列表,我相信这可以满足除了使用注册器类之外的所有要求。

关于c++派生类型的自动工厂注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9975672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com