我在头文件中实现了一些模板函数,我想将它们的范围限制在该头文件中,因为它们仅用作该文件中的辅助函数。未命名的命名空间不会起作用,因为当头文件包含在另一个文件中以使用主(非帮助)函数时,辅助函数会暴露出来。是否有限制其范围的解决方案?
答案 0 :(得分:2)
在头文件中声明帮助函数。
在源文件中定义辅助函数和模板。
是的,您可以将模板放入源文件中,只要它们不被任何其他翻译单元使用即可。 “模板总是需要在标题中”是一个需要被破坏的神话。请记住,编译器编译源文件:预处理器生成源文件,通常来自header include。当然,这是不寻常的,因为模板通常是为了通用而编写的,并且将它们限制在单个翻译单元中会使它们有些窒息。
答案 1 :(得分:2)
您可以做的一件事是将帮助函数放入头文件中的detail
或internal
命名空间。 Typically这些命名空间中的任何内容都保留用于实现,不应使用/依赖,因为它们可以更改,恕不另行通知。这不是万无一失的,因为没有什么能阻止用户使用它们,但至少他们知道他们正在玩火。
答案 2 :(得分:1)
宣布一个班级。
将模板声明为类中的私有静态函数。
在头文件中使用类friend
帮助函数。
答案 3 :(得分:1)
您可以将它放在类中,将其设置为私有,并将其他类作为好友类放在当前头文件中。类似的东西:
class Helper
{
friend class SomeClass;
friend class OtherClass;
template<typename A>bool someFunc(A, int a);
template<typename A>bool otherFunc(A);
}
答案 4 :(得分:1)
您可以将实现移动到cpp。 这将导致任何试图使用它们(除了你自己的项目)在链接时失败。
所以在标题中你有一个模板函数的前向声明:
template <typenamte T> void myFunc;
并在 .cpp 中获得了实施:
template <typenamte T> void myFunc
{
}