C++中的运行时接口和对象组合

Kno*_*ech 7 c++ components runtime interface

我正在为C++中基于接口的运行时对象组合寻找一个简单,轻量级的解决方案.我希望能够指定实现这些的接口(方法声明)和对象(可通过工厂模式创建).在运行时,我希望机制实例化这些对象并基于接口连接器互连这些对象.在运行时调用的方法应该保持相当便宜,即每次调用只有几个指令,与仿函数模式相当.

整个事情需要与平台无关(至少MS Windows和Linux).解决方案需要获得许可,如开源LGPL或(甚至更好)BSD或其他东西,特别是允许使用商业产品.

我不想要的是网络,进程间通信,额外的编译器步骤(一次性代码生成是可以的),或者对某些重型库(如Qt)的依赖性等重要事项.

具体方案是:我在一个更大的软件中有这样一种机制,但机制并没有很好地实现.接口由Dlls导出的基类实现.这些Dll还导出工厂函数,以基于手写的类ID实例化实现对象.

在我现在开始重新设计并自己实现更好的东西之前,我想知道是否有更好的东西.

编辑:该解决方案还需要支持多线程环境.此外,由于一切都将在同一个过程中发生,因此我不需要任何类型的数据序列化机制.

编辑:我知道这些机制是如何运作的,我知道几本教学书籍都包含相应的例子.我不想自己写.我的问题的目的是:是否存在某种"行业标准"的库?这是一个小问题(在一个过程中),我真的只是在寻找一个小解决方案.

编辑:我有建议添加一个我真正想做的伪代码示例.所以这里是:

在某个地方我想定义接口.我不在乎它是C-Headers还是一些语言和代码生成.

class interface1 {
public:
    virtual void do_stuff(void) = 0;
};

class interface2 {
public:
    virtual void do_more_stuff(void) = 0;
};
Run Code Online (Sandbox Code Playgroud)

然后我想提供(多个)实现.这些甚至可以放在基于Dll的插件中.特别是,这两个类我可以在两个不同的Dll中实现,这些Dll在编译时彼此不了解.

class A : public interface1 {
public:
    virtual void do_stuff(void) {
        // I even need to call further interfaces here
        // This call should, however, not require anything heavy, like data serialization or something.
        this->con->do_more_stuff();
    }
    // Interface connectors of some kind. Here I use something like a template
    some_connector<interface2> con;
};

class B : public interface2 {
public:
    virtual void do_more_stuff() {
        // finally doing some stuff
    }
};
Run Code Online (Sandbox Code Playgroud)

最后,我可以应用主要代码,我希望能够在运行时组合我的应用程序逻辑(例如,基于用户输入):

void main(void) {
    // first I create my objects through a factory
    some_object a = some_factory::create(some_guid<A>);
    some_object b = some_factory::create(some_guid<B>);

    // Then I want to connect the interface-connector 'con' of object 'a' to the instance of object 'b'
    some_thing::connect(a, some_guid<A::con>, b);

    // finally I want to call an interface-method.
    interface1 *ia = a.some_cast<interface1>();
    ia->do_stuff();
}
Run Code Online (Sandbox Code Playgroud)

我完全能够自己编写这样的解决方案(包括所有陷阱).我正在寻找的是一个由广泛的用户群使用和维护的解决方案(例如库).

Ton*_*rds 1

虽然没有被广泛使用,但我几年前编写了一个库来实现这一点。

你可以在 GitHub zen-core library上看到它,也可以在Google Code上找到它

GitHub 版本仅包含核心库,这确实是您所需要的全部。Google Code 版本包含很多额外的库,主要用于游戏开发,但它确实提供了很多关于如何使用它的好示例。

该实现的灵感来自于 Eclipse 的插件系统,使用一个plugin.xml 文件来指示可用插件的列表,以及一个config.xml 文件来指示您想要加载哪些插件。我还想更改它,以便它不依赖于 libxml2,并允许您能够使用其他方法指定插件。

由于一些黑客的原因,该文档已被销毁,但如果您认为这有用,那么我可以编写足够的文档来帮助您入门。