【发布时间】:2015-11-02 01:44:58
【问题描述】:
我正在构建一个 C++ API,它需要可扩展,而无需重新编译使用它的软件(出于很多不好的原因)。这需要不透明的数据类型,以便可以将字段添加到类中。像
struct CheshireCat; // Not defined here
std::unique_ptr<CheshireCat> d_ptr;
但是这个 API 会有很多简单的属性获取/设置方法,这些方法只访问 CheshireCat 中的字段。 (我不想听到“封装”哲学,这正是这个应用程序的方式。)
有一些巧妙的技术可以创建像 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++ 系统会非常出色,但遗憾的是事实并非如此。)
【问题讨论】:
-
我看不出你在哪里解释了你对 pimpl 成语的问题。 Getter/Setter 不是问题...
标签: c++ stl binary-compatibility