【问题标题】:Is it advisable to expose a templated class of a Library?公开图书馆的模板类是否可取?
【发布时间】:2011-05-20 04:17:58
【问题描述】:

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

【问题讨论】:

  • 我发现了一种方法,即在一个内联文件 (*.inl) 文件中实现。但是,你仍然可以看到所有的实现

标签: c++ templates metaprogramming


【解决方案1】:

我会从客户的角度来回答。

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

不是因为我想从作者那里撕掉它……不是因为我是一个无法无天的黑客……

很简单,因为:

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

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

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

(*) 在 C++ 中,Boost 有一些我认为在这方面根本上被破坏的库。代码充满了编译器的变通方法,这使得它非常难以阅读。不过,我使用它们是因为它们很棒。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

          • 我见过的所有编译器都附带了标准库的源代码。
          • 那是因为上面提到的其他原因——模板需要发布,标准库包含“标准模板库”。我见过的大多数编译器都附带标准 C 库的编译版本(Windows 上的 .lib)(如果只是为了方便的话)。它们提供源代码,因为在调试时拥有源代码通常很有用。
          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-12-16
              • 1970-01-01
              • 2021-02-15
              • 1970-01-01
              • 1970-01-01
              • 2011-11-03
              • 2013-01-09
              相关资源
              最近更新 更多