【问题标题】:C++ properties for opaque data types不透明数据类型的 C++ 属性
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 我认为在实践中你可以获得二进制兼容性,只要你使用相同的 C++ 编译器/版本、不透明的数据类型,并且只在末尾添加虚拟方法。 (最后一个要求很奇怪,但 C++ 编译器似乎没有为虚拟方法创建链接器符号,只是硬编码偏移量。)
  • 这取决于实现。我不想依赖将来可能会改变的实现细节。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多