如何正确包装第三方库结构?

时间:2011-04-26 11:32:10

标签: c++ wrapper bridge pimpl-idiom

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

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

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

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

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

包装器的缺点是:复制粘贴,用于在结构之间进行转换的附加代码。 直接包括的缺点是:打破pimpl习语。

这个问题可能还有其他解决办法吗?

另外我想强调第三方库不断变化,所以我必须采用我的资源来支持每个新版本的库。

2 个答案:

答案 0 :(得分:1)

Options结构似乎是公共API的一部分,而不是pimpl习惯用法隐藏的私有实现,所以看起来你应该在你的源代码中包含标题。

如果你这样做,唯一可能在第三方代码发生变化时破损的代码就是直接使用Options结构成员的代码,但大概是当这种代码发生变化时,你的代码无论如何都需要适当改变。这听起来像是一个API改变,所以看起来你已经被覆盖了。

答案 1 :(得分:1)

当我使用Bridge + pimpl模式时,我决定完全隐藏第三方库。