【问题标题】:limit scope of template function to a header file将模板函数的范围限制为头文件
【发布时间】:2016-06-22 12:34:50
【问题描述】:

我在头文件中实现了一些模板函数,我想将它们的范围限制在该头文件中,因为它们仅用作该文件中的辅助函数。未命名的命名空间不会起到作用,因为当头文件包含在另一个文件中以使用主(非辅助)函数时,辅助函数就会暴露出来。有没有办法限制他们的范围?

【问题讨论】:

  • 为什么不将它们移到 cpp 中?
  • 因为它们是模板?
  • 非偏执的解决方案:为命名空间命名(可能是“详细信息”)。您也可以将其放入额外的标题中,以将其隐藏得更多。
  • 想过,但我正在寻找实际的封装:)
  • 如果没有人使用,模板函数无论如何也不会被编译,所以给一个命名空间本质上就是封装了模板函数。如果您非常害怕其他人错误地使用该功能,请将其放在嵌套命名空间中。 :)

标签: c++ templates


【解决方案1】:

在头文件中声明辅助函数。

在源文件中定义辅助函数和模板

是的,您可以将模板放入源文件中,只要它们不被任何其他翻译单元使用。 “模板总是需要在标题中”是一个需要打破的神话。请记住,编译器 编译 文件:预处理器 生成源文件,通常来自头文件。诚然,这是不寻常的,因为模板通常是为了通用目的而编写的,并且将它们限制在单个翻译单元中有点窒息它们。

【讨论】:

  • 您说得有道理,但是根据您的建议,该功能仍然是公开的(通过声明)并且没有被封装。那么它是否可以包含在任何翻译单元中并声明?我一直在寻找封装解决方案。我想我必须使用空类
  • 如果 函数 包含模板参数,则模板必须对任何需要该函数的编译单元可见。
  • 但是如果模板成员函数是私有的,它们是如何封装在类中的呢?
  • 在没有代码 sn-ps 的 3 句问题上很难再有肉在骨头上;-)
  • 好吧,我猜根据答案,它要么使用详细信息之类的命名空间,要么使用空类模拟封装是可用的选项。还是谢谢
【解决方案2】:

您可以做的一件事是将帮助函数放入头文件中的detailinternal 命名空间。 Typically 这些命名空间中的任何内容都是为实现而保留的,不应使用/依赖它们,因为它们可能会在没有通知的情况下更改。这不是万无一失的,因为没有什么可以阻止用户使用它们,但至少他们知道他们在玩火。

【讨论】:

    【解决方案3】:

    声明一个类。

    将您的模板声明为类中的私有静态函数。

    在头文件中有friend类的辅助函数。

    【讨论】:

      【解决方案4】:

      你可以把它放在类中,将它设为私有,并将其他类作为朋友类放在当前头文件中。比如:

      class Helper
      {
          friend class SomeClass;
          friend class OtherClass;
          template<typename A>bool someFunc(A, int a);
          template<typename A>bool otherFunc(A);
      }
      

      【讨论】:

      • 为了增加一点额外的技巧,在标题的末尾做:#define Helper :)
      【解决方案5】:

      您可以将实现移至 cpp。 这将导致尝试使用它们的任何人(除了您自己的项目)在链接时失败。

      所以在 header 中有一个模板函数的前向声明:

      template <typenamte T> void myFunc;
      

      .cpp 中你得到了实现:

      template <typenamte T> void myFunc
      {
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 2014-08-25
        相关资源
        最近更新 更多