不透明数据类型的C ++属性

时间:2015-11-02 01:44:58

标签: c++ stl binary-compatibility

我正在构建一个C ++ API,需要可扩展而无需重新编译使用它的软件(出于很多不好的原因)。这需要不透明的数据类型,以便可以将字段添加到类中。像

这样的东西
struct CheshireCat; // Not defined here
std::unique_ptr<CheshireCat> d_ptr; 

但是这个API将有很多简单的属性get / set方法,只能访问CheshireCat中的字段。 (我不想听到&#34;封装&#34;哲学,这就是这个应用程序的方式。)

有一些聪明的技术可以创建像MyInt这样的类来覆盖运算符来模拟像

这样的属性
int & operator = (const int &i) { return value = i; }
operator int () const { return value; }

但是我看不出这样的MyInt在包含类中访问CheshireCat指针的好方法,更不用说结构中隐藏的属性了。

这似乎是一个非常普遍的问题,所以我正在寻找其他人的聪明解决方案。可能使用一些不起眼的宏观。

(替代方案是1.忘记二进制兼容性,或2.手动编写大量样板代码。)

我意识到对于二进制兼容性,需要在最后添加新的虚拟方法。 Mangling依赖于编译器,但对于给定的编译器应该是稳定的(我们将为特定的编译器/版本提供二进制文件)。

这感觉就像C ++ 101,但我找不到任何优雅地解决它的东西。 (我的背景是Java / .Net / Lisp,其中JITing解决了这个问题。在(DLL)链接器中完成最终编译阶段的C ++系统会非常好,但遗憾的是它不是这样的。)

1 个答案:

答案 0 :(得分:0)

我认为你不能通过暴露C ++来获得二进制兼容性。

您可以做的是公开C接口(二进制兼容)。这意味着,正如您所暗示的,暴露处理不透明句柄(即指针)的函数。

当然,内部可以用C ++编写。

相关问题