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

2024-02-29

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

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

我的目标:

  1. automatically register any derived class of my base class Base
    1. 只有我标记为的课程可注册的
    2. not only direct sub-classes of Base
      • ex:基础 -> 设备 -> 相机 ->Webcam
      • 这将使使用CRTP http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern就像描述的那样这个问题 https://stackoverflow.com/questions/6399804/automatic-static-invocation-of-derived-types难的
  2. 对我想要注册的课程进行最小的更改 -假人证明
  3. would prefer using a registrator class than macros
    • like in 这个问题 https://stackoverflow.com/questions/6399804/automatic-static-invocation-of-derived-types,但我不确定这是否取决于CRTP http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

我拥有的:

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;
};
  • 模板化抽象工厂,具有标准::字符串 as key type
  • 抽象工厂拥有所有成员和方法static
  • 类名会自动恢复typeid(注册时不需要文字名称)
  • 拨打电话报名:abstract_factory<Base>::register_class<MyDerived>();

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

  • registrator<Derived> class: templateded class that is instantiated statically in Derived.cpp and should call abstract_factory::register_class<Derived>() in it's constructor
    • 永远不会被调用或实例化
    • 如果我举个例子Derived in main()这有效->虽然有点违背了目的
  • 在每个中声明一个简单的静态变量Derived.hpp并使用静态注册方法进行设置Derived.cpp-> 再说一次,永远不会被调用。
  • make abstract_factory一个真正的单身人士而不是让一切都是静态的?

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


我使用带有会员的单例进行注册,基本上:

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 的客户端文件夹,用户将其作为二进制构建的一部分包含在内。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++派生类型的自动工厂注册 的相关文章

  • Qt 图表和数据可视化小部件

    我已经安装了 Qt 5 7 来尝试 Qt 图表和 Qt 数据可视化 但我在 Qt Designer 和 Qt Creator 中都找不到新的小部件 有什么建议我应该做什么才能让新的小部件出现在设计器中 我今天遇到了完全相同的问题 默认情况下
  • Linq - 从表达式 创建表达式

    我有一个谓词Expression
  • 生成多个随机数

    我想生成 25 个唯一的随机数并将它们列在控制台中 数字的长度应至少为 10 个字符 有什么简单的方法可以做到这一点吗 尝试将数字构建为字符串 并使用 HashSet 确保它们是唯一的 Random random new Random Ha
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

    我的代码中有这个问题 bool CBase isNumber return id MID NUMBER bool CBase isVar return id MID VARIABLE bool CBase isSymbol return i
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • Monotouch全局异常处理

    我在野外发现了一只令人讨厌的虫子 但我无法确定它的具体情况 有没有办法拥有全局 Try Catch 块 或者有办法处理 Monotouch 中未处理的任何异常 我可以包起来吗UIApplication Main args 在 try cat
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 在c#中获取没有时间的日期

    我的表上有一列 缺勤日期时间 日期 当我想要获取包含日期的行时 它返回 0 行 这是我的 C 代码 DateTime ClassDate DateTime Parse lblDate Content ToString var Abs dbs
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • 如何构建一棵与或树?

    我需要一个支持 与 和 或 的树结构 例如 给定一个正则表达式 如ab c d e 我想把它变成一棵树 所以 一开始我们有两个 或 分支 它可以向下ab or c d e 如果你低头ab分支 你得到两个节点 a and b or a其次是b
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • 从 DataRow 单元格解析 int [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何从 DataRow 单元格解析 int 值 Int32 Parse item QuestionId ToString 这段代码可以工作 但看
  • Type.GetInterfaces() 仅适用于声明的接口

    首先 像这样的问题有很多 也许有些OP甚至在问同样的问题 问题是这些问题的答案 无论是否接受 都没有真正回答这个问题 至少我找不到 如何确定类直接声明的接口 而不是由父级或声明的接口继承的接口 e g interface I interfa
  • 连接到没有元数据的网络服务

    我想连接到此网络服务 https training api temando com schema 2009 06 server wsdl https training api temando com schema 2009 06 serve
  • C 变量声明的效率 [重复]

    这个问题在这里已经有答案了 例如 在 C 中声明一个变量需要多长时间int x or unsigned long long var 我想知道它是否会让我的代码在类似的事情中更快 for conditions int var 0 code 这
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 如何在 C 中创建最低有效位设置为 1 的掩码

    这个功能如何运作 最低有效 n 位设置为 1 的掩码 Example n 6 gt 0x2F n 17 gt 0x1FFFF 我根本不明白这些 尤其是 n 6 gt 0x2F 另外 什么是面膜 通常的方法是采取1 并将其左移n位 这会给你类

随机推荐

  • 如何检索单元格评论的文本

    我找到了很多用于创建的示例 但没有找到用于检索单元格注释文本的示例 我错过了一些明显的事情吗 Range Comment Text似乎在这里工作没有任何问题 e g if not ActiveCell Comment is nothing
  • RestKit 不会从本地存储中删除孤立对象

    您好 我已将 RestKit 从 0 10 2 更新到 0 20 3 现在更新后 当 Web 服务中缺少对象时 RestKit 不会从本地存储中删除它们 我知道 RestKit 0 20 x 支持它 但我无法配置它 我按照这里给出的例子进行
  • 如何通过其值而不是位置设置微调器默认值?

    我的数据库中有 1 50 条记录 我使用游标获取这些数据 并使用简单游标适配器将这些值设置为 Spinner 现在我需要的是我想设置一个值 例如第 39 个值 作为默认值 但我不想通过它的位置来设置它的值 我知道如何通过其位置设置微调器默认
  • 在Centos 6.6 64位中安装pymssql

    我尝试在 Centos 6 6 中 pip install pymssql 但不断遇到此错误 mssql c 314 22 错误 sqlfront h 没有这样的文件或目录 cpp helpers h 34 19 错误 sybdb h 没有
  • 检测节点在场景中何时可见

    我正在尝试找到一种方法来检测 或接收通知 节点已添加到场景中并且可见 我正在主 JavaFx 线程中创建 Node 对象 并将它们添加到舞台和场景中 使用Platform runLater 但是 我希望 Node 对象接收已添加到场景中并且
  • Typescript:将 JSON 对象转换为类/接口对象

    我正在尝试将 API 响应转换为打字稿类 接口 这里 API 返回具有某些属性的对象列表 但我只需要响应对象的少数属性 API响应示例 Id 1 Name test Description Test PropertyX x Property
  • DNS 在 PHP 中不工作(但一般情况下可以)

    以下脚本 返回 DNS 记录列表 但最终在 file get contents 上失败 尽管 phpinfo 说 allow url fopen On On allow url include Off 出现以下错误 PHP 消息 PHP 警
  • 从 Numpy 中的多个切片中选择

    说我们有 a np ones 3 3 3 and slices 0 1 slice None 0 slice None 0 slice None 1 0 有没有一种简单的方法来选择 更改值a from slices 例如 我想分配0 to
  • 在 JSF 中向 selectOneMenu 添加“未选择任何内容”选项的最佳方法

    我想知道允许用户在 selectOneMenu 中不选择任何内容的最佳或最简单的方法是什么 我的示例 我有一个注册用户列表 管理员应该能够按某些条件过滤显示的用户列表 这些标准 例如用户类型 员工 客户 可以通过 selectOneMenu
  • Twitter bootstrap .popover 不工作

    我正在尝试让 Twitter Bootstrap 的 popover 工作 并且我几乎复制了我网站上的代码 但它告诉我 Object object object 在检查元素上没有方法 popover 我在 bootstrap tooltip
  • 根据另一列中的值创建新的指标列

    我有一些数据看起来像这样 import pandas as pd fruits apple pear peach df pd DataFrame col1 i want an apple i hate pears please buy a
  • PHP Doctrine 初学者:Doctrine\ORM\Tools\Setup 未找到

    我是教义的初学者 我刚刚安装了 pear 主义 2 3 3 并想测试它 为了测试教义 我写了一个名为 person 的类 Entity class person Id Column type integer GeneratedValue p
  • Scala:用于未来理解的 ExecutionContext

    当我做一个future 或应用类似的方法onSuccess and map 我可以为它们指定 ExecutionContext 例如 val f future code executionContext f map someFunction
  • 防止 pandoc 将 $ 转换为 mediawiki

    我正在使用 pandoc 将 markdown 文件转换为 mediawiki 表 文件内容mtcars md c1 c2 7 P A A 8 AB B 9 P A C 然后我就这样做了 我使用的是 Ubuntu 64 位和 pandoc
  • 在 Objective-C/cocoa 中抛出异常

    在 Objective C cocoa 中抛出异常的最佳方法是什么 I use NSException raise format 如下 NSException raise Invalid foo value format foo of d
  • 为什么我的 SVG 在 Polymer 组件内由 D3 渲染,没有样式?

    这里有一个Plunker我的问题的草图 http plnkr co 7hW5Rp71Qy1IwptZx4i6 相关代码 包含 Polymer 模板及其调用
  • Kendo UI 网格在调用读取后未填充

    好吧 我还有另一个 我确信我又错过了一些简单的东西 使用 json 结果集填充 Kendo 网格 加载是通过从剑道下拉列表控件中进行选择来触发的 我可以看到数据从我的 webapi 返回并转换为 json 结果 但数据未显示在网格中 我错过
  • 避免以编程方式启动使用创建的上下文的 HiveThriftServer2

    在 Spark 2 0 0 中 我们尝试使用 ThriftServer 从 Spark 临时表中查询数据 首先 我们创建了启用了 Hive 支持的 SparkSession 目前 我们使用 sqlContext 启动 ThriftServe
  • 轨道模型和独特的组合

    我有一个 Rails 应用程序 其中有一个名为friendrequests 它看起来像这样 user1 id integer user2 id integer hasaccepted boolean 我正在创建一个添加好友的选项 但好友请求
  • C++派生类型的自动工厂注册

    像我之前的许多人一样 我正在尝试让我的派生类型自动向我的工厂注册 我通读了很多问题 并试图专注于我在那里没有找到的问题 除了自动注册之外 一切都运行良好 我的目标 automatically register any derived cla