重组类以从 dll 导出类

Posted

技术标签:

【中文标题】重组类以从 dll 导出类【英文标题】:restructure classes to export class from dll 【发布时间】:2014-10-14 16:00:44 【问题描述】:

我有一个库,其中我有一个模板类,它采用结构类型作为模板参数并执行一些操作,如保存(转储到文件中)、打开(打开文件以保存结构数据)等。

template<class T>
class MyDataSaver;

所以库的用户使用他们希望的任何成员创建他们的结构,然后编写大小,像模板类使用和执行操作的结构中的简单函数一样序列化。 创建模板类的新实例

struct StructType

  int i;
  char ch;

  int size()  return sizeof(i) + sizeof(ch);
  template<class Archive>
  void serialize(Archive ar)ar & i & ch;
;

MyDataSaver<StructType> myData;
// And then
myData.save()
// and
myData.open().

现在我的问题是,我想将库转换为 dll。如何重构此代码或创建一个新类,它可以允许库用户使用 dll 而不是库,而库用户端的代码更改最少?

我能想到的一种粗略方法是,创建一个新模板类并在其中包含一个字节数组,然后导出它以及如何通过这个新类存储结构类型。

我想要一个应用程序可以加载的动态链接 dll(不是那些使用 lib 文件与应用程序链接的 dll)。因此,如果我对 dll 进行更改,例如更改数据保存媒体,或使用 crt 文件函数而不是特定于操作系统的函数,则使用 dll 的应用程序应该仍然能够加载和使用它,就好像没有任何更改一样。因此,除了更改界面之外,所有更改都不会对应用程序产生影响。

【问题讨论】:

【参考方案1】:

当您使用模板时,编译器会在编译时实例化(创建类型/类)。因此,您需要知道 T 的类型才能在您的 dll 中实例化一个特定的类,您肯定猜到这是不可能的。

一种好的方法是创建 header only 库(就像大多数 Boost 库一样)。并在 *.hpp 文件中提供您的 API。

如果您不希望其他人看到您的代码,那么有很多方法可以实现,但那是另一回事了。

您也可以有兴趣阅读以下内容:Benefits of header-only libraries

【讨论】:

以上是关于重组类以从 dll 导出类的主要内容,如果未能解决你的问题,请参考以下文章

债务重组的会计处理方法

2016年5月14日 厦门 KTV点歌系统数据库修复误格式化 数据库碎片重组找回

SqlServer2008R2重组索引

IP报文为啥要分片和重组

重构——代码坏味道&重组函数.md

重组操作