我正在开发一个C ++中的矩阵计算库。为此,我想使用模板。在做了一些模板元编程之后,我意识到我最终会在Templatise Matrix类中公开我的实现。当你公开那个特定的模板类时,有没有办法在头文件中模糊模板类的实现?如果是,那么它是如何完成的?
答案 0 :(得分:5)
我将从客户的角度回答。
当我需要使用库并将其集成到我的代码中时,我希望看到源代码。
这不是因为我希望将其从作者中删除......这不是因为我是一个无法无天和无关的黑客...
简单地说,因为:
我不要求代码是免费的,我对获得许可的代码完全没问题,而且我会严格遵守许可条款,我只是要求代码可用。
坦率地说,如果我在两个库之间做出选择,并且一个不暴露其代码,我会倾向于另一个,除非性能/正确性差异非常重要。
(*)在C ++中,Boost拥有我认为在这方面从根本上被打破的库。代码充满了编译器的解决方法,这使得它很难阅读。不过,我使用它们是因为它们真棒。
答案 1 :(得分:4)
使用当前标准(甚至即将推出的C ++ 11),必须公开使用这些模板的所有template
定义。没有标准的隐藏方式。
第二部分,如果您选择混淆,那么它的使用方式也会变得复杂。我认为最好的方法是许可/版权他们!
答案 2 :(得分:4)
由于模板意味着类/函数的实现是在编译时创建的(需要为每个新类型创建一个新实现),我无法看到如何隐藏代码。唯一的方法是将模板隐藏在预编译库中,并仅将接口暴露给预定义类型。那会失去模板功能......
答案 3 :(得分:1)
我认为所有基于模板的C ++库都被部署为头文件(也许还使用库,但公共可用的模板必须是头文件)。对于STL,boost等都是如此。这只是模板工作的方式 - 编译器必须看到原始模板。
答案 4 :(得分:1)
除了引用的所有其他原因之外,还有另一个问题:C ++名称是“装饰的” - 例如,为了支持方法重载,方法的参数类型在方法名称中编码。
此编码没有标准,它因编译器而异,甚至从编译器的一个版本到同一编译器的另一个版本。
因此,如果您有一个包含C ++函数的库,则无法确保客户端可以读取函数的名称(除非您可以保证您的客户端使用相同版本的编译器,你是。)
对于标准库,这不是问题,因为库随编译器一起提供,但对于其他库,您需要非常小心。
答案 5 :(得分:0)
不,不是真的,因为模板不是编译代码。它实际上是一个“模板”。在.cpp文件中实例化模板时,模板本身需要可供编译器使用才能生成类方法的代码。因此,您无法“隐藏”模板代码......它必须可供编译器使用,否则您将无法编译任何尝试实例化模板的模块。
考虑模板的一种好方法就像你可能会使用的空白表格,比如所得税或某种性质的东西。为了实际制作有效的所得税表格,意思是填写了您的姓名,SSN等,您需要一份“空白”原件。所以你不能“隐藏”一个人的形式,并期望他们正确地填写它。编译器也是如此。当您实例化模板函数或类时,需要使模板的副本可供编译器填写模板参数并实际为您生成幕后的“真实”代码,然后在代码中编译模块。
答案 6 :(得分:0)
您可以将代码放在预编译的标题中,但我必须同意保护代码的最佳方法是放置许可/版权。