是否可以公开模板库的模板类?

时间:2011-05-20 04:17:59

标签: c++ templates metaprogramming

我正在开发一个C ++中的矩阵计算库。为此,我想使用模板。在做了一些模板元编程之后,我意识到我最终会在Templatise Matrix类中公开我的实现。当你公开那个特定的模板类时,有没有办法在头文件中模糊模板类的实现?如果是,那么它是如何完成的?

7 个答案:

答案 0 :(得分:5)

我将从客户的角度回答。

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

这不是因为我希望将其从作者中删除......这不是因为我是一个无法无天和无关的黑客...

简单地说,因为:

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

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

坦率地说,如果我在两个库之间做出选择,并且一个不暴露其代码,我会倾向于另一个,除非性能/正确性差异非常重要。

(*)在C ++中,Boost拥有我认为在这方面从根本上被打破的库。代码充满了编译器的解决方法,这使得它很难阅读。不过,我使用它们是因为它们真棒。

答案 1 :(得分:4)

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

第二部分,如果您选择混淆,那么它的使用方式也会变得复杂。我认为最好的方法是许可/版权他们!

答案 2 :(得分:4)

由于模板意味着类/函数的实现是在编译时创建的(需要为每个新类型创建一个新实现),我无法看到如何隐藏代码。唯一的方法是将模板隐藏在预编译库中,并仅将接口暴露给预定义类型。那会失去模板功能......

答案 3 :(得分:1)

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

答案 4 :(得分:1)

除了引用的所有其他原因之外,还有另一个问题:C ++名称是“装饰的” - 例如,为了支持方法重载,方法的参数类型在方法名称中编码。

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

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

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

答案 5 :(得分:0)

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

考虑模板的一种好方法就像你可能会使用的空白表格,比如所得税或某种性质的东西。为了实际制作有效的所得税表格,意思是填写了您的姓名,SSN等,您需要一份“空白”原件。所以你不能“隐藏”一个人的形式,并期望他们正确地填写它。编译器也是如此。当您实例化模板函数或类时,需要使模板的副本可供编译器填写模板参数并实际为您生成幕后的“真实”代码,然后在代码中编译模块。

答案 6 :(得分:0)

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