适当组织模板化和非模板化功能的混合,最终用户无法访问

pen*_*ope 5 c++ templates declaration

在我正在开发的项目中,我目前正在实现一个模板化的算法.我在组织我的函数声明和定义时遇到了一些问题,因为涉及模板(我在这里问了一个关于如何处理非模板化函数的问题" 与模板化函数一起分组").然而,这使我对这种文件的一般正确组织感到疑惑.

我想将所有定义所有声明分开(仅出于可读性的目的,即使我必须将模板化定义包含在声明中).

我得到的答案建议组织如下:

  • algo.h所有函数声明的声明文件
  • 模板定义文件algo.tpp将被包含在algo.h(模板需要在编译时声明)
  • (非模板化)定义文件algo.cpp不包含在任何地方.

如果所有定义的函数都应该对最终用户可见(即所有声明都在algo.h文件中),这很有效.但是,有时我喜欢将我的大功能分解为更小的功能,但我希望最终用户只能访问"大功能",而不能访问他们的子功能. 在非模板化设置中,我会这样做:

  • 声明文件algo.h包含针对最终用户的声明(可通过include访问)
  • 这些功能的定义将会发生 algo.cpp
  • 子功能的定义(和声明)将只出现algo.cpp,让我大功能algo.cpp(一宣布algo.h)使用它们,而不是让他们给最终用户访问.

如果这些子功能本身不是模板化的,而是由模板化函数使用,则这不再起作用.模板化的子功能可以进入.tpp文件,被模板化的"大功能"使用,一切都很好.

但是,如果这些功能是非模板化的,如果放在文件中,它们会导致多个定义错误(这是我之前的问题所在).tpp.另一方面,如果它们位于单独的.cpp文件中,它们或者最终用户可以访问(如果我将声明放在.h文件中),或者对于要使用它们的大函数是不可访问的(如果我不放.cpp文件外的声明).

组织函数的正确方法是什么,有些是模板化的,有些不是,有些应该是最终用户可以访问的,有些则不是,可以访问多个文件?

理想情况下,(对于完整性),我在寻找答案应该解决的位置如下(在.h,.tpp,.cpp,或其他相应的文件):

  • 模板化的客户端功能
  • 非模板化客户端功能
  • 模板化的客户端功能
  • 非模板化客户端功能
  • 所有上述声明(使用声明时)

我想要的功能的短几乎伪代码示例(没有文件分离)

    // Templated sub-functionality, used by bigFunctionality,
    // but ideally not accessible to the end-user
    // This might not be possible since it is templated,
    // so I am content with putting it in the .tpp file
    template <typename Compare>
    void subFunctionality(Compare order, .. args ..){ /* impl */ }

    // Non-templated sub-functionality, used by
    // bigFunctionality, but NOT accessible to the end-user
    void moreSubFunctionality(.. args ..) { /* impl */ }


    // the main functionality, meant to be
    // accessible to everybody across all files:
    template <typename Compare>
    void bigFunctionality( .. non-templated args ..., Compare order){
         subFunctionality(order, .. args ..);
         moreSubFun(.. args ..);
         // more stuff
    }
Run Code Online (Sandbox Code Playgroud)

再一次,我正在研究如何将其分成多个文件(即使它们彼此包含在一起,因为必须使用模板),部分用于可读性目的,部分用于可访问性.

仅仅是为了澄清,这些是算法 - >函数,而不是类.(我知道将模板化和非模板化函数放入相同的模板类可以解决我的问题).

PS:我知道问题的标题非常长而且很长,所以如果有人想要缩短它,我会非常乐意提出建议/编辑