c++ - 如何正确包装第 3 方库结构?

标签 c++ wrapper bridge pimpl-idiom

在我的项目中,我使用了一个不断变化的第 3 方库。我有这个库的包装器类(桥接模式 + Pimpl 模式)。因此,除了包装器实现之外,我的任何来源都看不到该库。 这个库有一个 Options 结构,例如

struct Options {
  double distance;
  double weight;
  int num_rabbits;
  // etc
};

我希望这个结构在 GUI 模块中可用,以构建一个允许设置这些选项的对话框。我需要为它创建一个包装器结构吗?例如

struct MP_ThatLibOptions {
  // exact member copy
  double distance;
  double weight;
  int num_rabbits;
  // etc
};

或者我应该直接将该结构头包含到我的源代码中吗?

wrapper 的缺点是:复制粘贴,结构之间转换的额外代码。 direct include 的缺点是:打破了 pimpl 习惯用法。

这个问题是否还有其他解决方案?

另外我想强调的是,第 3 方库在不断变化,因此我必须采用我的源代码来支持库的每个新版本。

最佳答案

Options 结构似乎是公共(public) API 的一部分,而不是 pimpl 习语旨在隐藏的私有(private)实现,因此您似乎应该在源代码中包含 header 。

如果你这样做,当第 3 方代码发生变化时,唯一容易被破坏的代码是直接使用 Options 结构成员的代码,但大概当它发生变化时,你的代码无论如何都需要适本地改变,因为这听起来像是一个 API 更改,所以看起来您已经被覆盖了。

关于c++ - 如何正确包装第 3 方库结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5789672/

相关文章:

c++ - 辛是如何工作的?

c++ - friend 类不适合我?

ios - RCTBatchedBridge.m 错误 : Invalid data message - all must be length:%zd. React Native,iOS 模拟器

postgresql - 来自守护程序 : network bridge not found 的错误响应

c++ - 什么是内存更昂贵。 "creating and deleting objects"还是 "reusing a object"?

c++ - 如何打印二维字符数组 C++

C# InputSimulator 包装器 - 如何使用它?

Python - 在命名它包装的函数后调用包装函数

client - Luci(Openwrt)无线网桥客户端-如何配置?