是否建议公开库的模板化类

Is it advisable to expose a templated class of a Library?

本文关键字:是否      更新时间:2023-10-16

我正在用C++开发一个矩阵计算库。为此,我想使用模板。在做了一点模板元编程之后,我意识到我最终会在模板化矩阵类中公开我的实现。当你公开特定的模板类时,有什么方法可以混淆头文件中的模板类实现吗?如果是,那么是如何做到的?

我将从客户的角度回答。

当我需要使用库并将其集成到代码中时,我希望看到源代码。

这并不是因为我想把它从作者那里撕下来。。。这并不是因为我是一个无法无天的黑客。。。

简单地说,这是因为:

  • 代码是文档,看到方法的实现将帮助我弥补它的不足,或者更好地理解它的含义(*(
  • 对于调试来说,深入库代码的能力是非常宝贵的
  • 对于开发来说,如果我能自己编译各种风格的代码(有和没有工具,也就是gcov,有和没有调试符号,等等(,那就容易多了

我不要求代码是免费的,我对获得许可的代码完全满意,我会严格遵守许可条款,我只是要求代码可用。

坦率地说,如果我可以在两个库之间进行选择,并且其中一个库不公开其代码,我会倾向于另一个库,除非性能/正确性差异真的很重要。

(*(在C++中,Boost有一些库,我认为这些库在这方面已经从根本上被破坏了。代码中充斥着编译器的工作,这使得它很难阅读。尽管如此,我使用它们是因为它们太棒了。

由于模板化意味着类/函数的实现是在编译时创建的(需要为每个新类型创建一个新的实现(,我看不出如何隐藏代码。唯一的方法是将模板隐藏在预编译库中,并且只向预定义类型公开接口。这将失去模板功能。。。

对于当前标准(甚至即将推出的C++11(,必须公开使用这些模板的所有template定义。没有标准的方法来隐藏它。

第二部分,如果您选择模糊,那么它的使用也同样会变得复杂。在我看来,最好的方法是许可/版权他们!

我认为所有基于模板的C++库都部署为头文件(也许也使用库,但公共可用的模板必须是头文件(。STL、boost等都是如此。这只是模板的工作方式——编译器必须查看原始模板。

除了列举的所有其他原因外,还有另一个问题:C++名称是"修饰的"-例如,为了支持方法重载,方法的参数类型被编码在方法名称中。

这种编码没有标准,它因编译器而异,甚至从一个编译器的一个版本到同一编译器的另一个版本。

因此,如果你有一个包含C++函数的库,你就无法确保你的客户端可以读取函数的名称(除非你能保证你的客户端使用与你相同版本的编译器(。

对于标准库,这不是问题,因为这些库是随编译器一起提供的,但对于其他库,您需要非常小心。

不,不是真的,因为模板不是编译代码。它实际上是一个"模板"。当模板在.cpp文件中实例化时,编译器需要使用模板本身,以便生成类方法的代码。因此,您不能"隐藏"模板代码。。。它必须对编译器可用,否则您将无法编译任何试图实例化模板的模块。

考虑模板的一个好方法就像你可能使用的空白表格,比如所得税或类似性质的表格。为了真正制作一份有效的所得税表格,也就是说填写了你的姓名、SSN等的表格,你需要一份"空白"原件的副本。因此,你不能向别人"隐藏"表格,并期望他们正确填写。编译器也是如此。当您实例化模板函数或类时,需要为编译器提供模板的副本,以填充模板参数,并在后台为您实际生成"真实"代码,然后在代码模块中进行编译。

您可以将代码放在预编译的头中,但我必须同意保护代码的最佳方法是放上许可证/版权。