c++ - 重组类以从 dll 导出类

标签 c++ c templates dll

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

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 的应用程序仍然应该能够加载和使用它,就好像没有任何更改一样。因此,除了更改界面之外,所有更改都不会对应用程序产生影响。

最佳答案

当您使用模板时,编译器会在编译时实例化(创建类型/类)。因此,您需要知道哪种类型是 T 才能在您的 dll 中实例化特定的类,正如您所猜测的那样,这是不可能的。

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

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

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

关于c++ - 重组类以从 dll 导出类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26365178/

相关文章:

python - 从 Django 1.5 的 ListView 中删除项目

magento - 如何在模板文件中加载自定义 PHP Magento block

c++ - 键盘记录器和鼠标追踪器 : should I use non-blocking I/O?

c++ - 如果我使用 scanf 程序终止

c - 使用c中的线程乘法矩阵

c++ - 为什么指向整数的指针递增 4 个字节?

c++ - 限制连接 BSTR 的参数类型

c++ - 使用 std::async 调用采用 unique_ptr 的函数

c++ - 虚拟析构函数?

c++ - Libxml++ : Returning Line/Column number upon validity errors