在编译时决定构造对象

时间:2013-05-08 13:41:29

标签: c++ cmake

我有以下问题要解决。

我有组件A.这个组件有一些子组件--B,C,D。使用cmake我正在构建或不构建那些B,C,D组件。这取决于当前的平台配置。我的cmake系统正在制作可执行的makefile(用于A组件),用于仅链接那些在给定的cmake运行中使用的组件。如果构建了组件B,则将其添加到可执行文件中(如果不是) - 未链接。与其他相同 - C,D。

所有这些B,C,D组件都提供了A组件中使用的接口的一些实现。该A组件应管理由B,C,D创建的对象,并在适当的时间使用适当的对象将这些对象保存在某个映射中。

问题:

我想实现一些简单可靠的机制,用于自动添加实现A接口的那些对象,就像现在使用链接一样 - 链接只是构建的模块。与这些对象相同 - 我希望只有在编译它们时才能在A组件中注册它们。

我很难解释它。这个想法很简单 - 在编译时构建这些对象的一些映射。只有编译的组件才能将其对象提供给此映射

1 个答案:

答案 0 :(得分:1)

我使用的设计类似于Objective-C和Smalltalk如何实现方法。

在C ++中,方法==成员函数,必须在编译时定义。因此,即使接口可以使用预处理器等机制进行扩展,相同的配置也必须影响类的任何客户端,否则它们根本不会链接。

所以我使用消息传递系统来调用对象上的方法。因此,如果A是主类,并且您在C和D但不是B中编译,则A的消息处理器将仅响应具有由C和D注册的处理程序的消息。

这种类型的设计确实需要某种消息系统。有许多现有的系统,如Google Protocol Buffers和Apache Thrift。我选择设计一个,因为我想要比大多数现有系统允许的更多运行时可配置性(许多这些消息系统都涉及IDL编译器)。

然而,它确实让我更接近OO领域,而不是C ++通常允许的混合范式语言。