在我正在进行的一个项目中,我目前正在实现一个模板化的算法。我在组织函数声明和定义时遇到了一些问题,因为涉及模板(我问了一个问题here https://stackoverflow.com/q/25139535/884412关于如何处理非模板化函数与模板函数“分组”在一起)。然而,这让我想知道这些文件的一般正确组织方式。
我想分开所有的定义 from 所有声明(只是为了可读性目的,即使我必须将模板化定义包含回声明中)。
我得到的答案建议组织如下:
- 声明文件
algo.h
对于所有函数声明
- The 模板化的定义文件
algo.tpp
它将被包含在algo.h
(模板需要在编译时声明)
- (非模板化)定义文件
algo.cpp
不包含在任何地方。
如果所有定义的函数都应该对最终用户可见(即所有声明都在algo.h
文件)。然而,有时我喜欢把我的大功能分解成更小的功能,但是我希望最终用户只能访问“大功能”,而不是其子部分。 在非模板设置中,我会这样做:
- 声明文件
algo.h
将包含仅针对最终用户的声明(将通过包含访问)
- 这些函数的定义将转到
algo.cpp
- 子功能的定义(和声明)将只在场 in the
algo.cpp
,允许我的大功能 in algo.cpp
(其中声明的algo.h
)使用它们,但不让最终用户可以访问它们。
如果这些子功能本身不是模板化的,而是由模板化函数使用的,那么这将不再起作用。模板化的子功能可以进入.tpp
文件,被模板化的“大函数”使用,一切都很好。
然而,如果这些功能不是模板化的,它们会导致多重定义错误(即我之前的问题是关于什么的 https://stackoverflow.com/q/25139535/884412)如果放置在.tpp
文件。另一方面,如果它们位于单独的.cpp
文件中,它们要么可供最终用户访问(如果我将声明放在.h
文件),或者无法访问旨在使用它们的大函数(如果我不将声明放在.cpp
file).
组织功能的正确方法是什么,一些模板化和some not,其中一些应该可供最终用户访问,而另一些则不能访问到多个文件中?
理想情况下,(为了完整性),我正在寻找的答案将解决以下内容的放置(在.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
}
再次,我正在研究如何将其分成多个文件(即使它们彼此包含在一起,因为它必须使用模板完成),部分是为了可读性目的,部分是为了可访问性。
只是为了澄清,这些是算法 --> 函数,而不是类。 (我知道将模板化和非模板化函数放入同一个模板化类中可以解决我的问题)。
PS: I know the title of the question is very big and long, so if somebody has an idea about shortening it, I would be more than happy for the suggestions/edits