2

我正在为可扩展架构设计(集思广益)一个 C++ 插件框架。每个插件注册一个接口,由插件自己实现。这样的框架可能运行在相对强大的嵌入式设备(例如 Atom/ARM)上,所以我可以使用 STL 和 Boost。

目前我已经设法编写了一个类似的框架,其中接口是预先知道的,并且插件(从动态库加载)注册实现它们的对象。这些对象由它们的工厂方法根据需要进行实例化,并且方法被正确调用。

现在我想让它更灵活,让插件注册新接口(不仅仅是实现现有接口),从而扩展框架用户可用的 API。

我想过使用 std::map<std::string, FunctionPtr>,我读过的几篇文章和 stackoverflow 回复也提到了这一点。不幸的是,它似乎没有捕捉到不同方法接口的情况。

我觉得它可能与模板元编程或特征有关,但我无法弄清楚它应该如何工作。任何人都可以帮忙吗?

4

3 回答 3

2

尝试查看 XPCOM 为您解决这些问题 - 通过重新实现 COM。

您有不知道插件为您的应用程序提供什么接口的问题,因此您需要一种方法让开发人员访问它,而编译器不知道它是什么(但是,如果您提供头文件,那么突然间您就知道了它是什么,你可以编译它而不需要插件未知接口的花哨)

因此,您将不得不依赖接口的运行时确定性,这大致要求您以某种方式定义接口,以便框架可以在其上调用任意方法,我认为您可以做到这一点的唯一现实方法就是将每个接口定义为一组函数指针,单独加载,然后存储在数据中供用户调用。这几乎意味着指向名称的函数指针映射。这也意味着您只能通过使函数名称唯一来用户编译器的细节(例如重载)。编译器通过将所有函数“修改”为唯一的编码名称来为您完成此操作。

Type Traits will help you wrap your imported functions in your framework, so you can inspect them and create classes that work with any imported type, but it isn't going to solve the main problem of importing arbitrary functions.

Possibly one approach that you'll want to read is Metaclasses and Reflection by Vollmann. This was referenced by the C++ standard body, though I don't know if it will become part of a future spec. Alternatively you can look at Boost.Extension

于 2012-04-28T14:48:00.733 回答
0

也许您需要检查的第一件事是 COM。

于 2012-04-28T09:32:59.083 回答
0

任何可以用模板完成的事情,都可以不用手工编写“模板实例”来完成,尽管方式可能不太方便。

如果您的框架在编译时没有看到 的声明class MyNewShinyInterface,则它不能存储 type 的指针,MyNewShinyInterface *也不能将它们返回给框架用户。再多的模板魔法也无法改变这一点。该框架只能存储指向某个基类的指针。用户将不得不做一个dynamic_cast检索正确类型的指针。

函数指针也是如此,只有函数没有基类,并且必须执行容易出错的操作reinterpret_cast才能检索正确的类型。(这只是更喜欢正确对象而不是函数指针的另一个原因。)

于 2012-04-28T09:33:59.760 回答