假设我在头文件中声明了两个模板函数:
template <typename T> void func1(const T& value);
template <typename T> void func2(const T& value);
Run Code Online (Sandbox Code Playgroud)
并且假设这些函数的实现(也在头文件而不是源文件中,因为它们是模板)使用一些实现辅助函数,它也是一个模板:
template <typename T> void helper(const T& value) {
// ...
}
template <typename T> void func1(const T& value) {
// ...
helper(value);
}
template <typename T> void func2(const T& value) {
// ...
helper(value);
}
Run Code Online (Sandbox Code Playgroud)
在我包含头文件的任何源文件中,辅助函数都是可见的.我不希望这样,因为辅助函数只是一个实现细节.有没有办法隐藏辅助功能?
Mik*_*our 20
一种常见的方法(例如,在许多Boost库中使用)是将助手放在一个名为的名称空间中details,可能在一个单独的标题中(包含在"public"标题中).
没有办法阻止它可见和可调用,但这清楚地表明它是实现的一部分,而不是接口.
我脑子里有两个选择:
既定的先例是将这种东西放在一个特别(即一致)命名的嵌套命名空间中。Boost 使用namespace details,Loki 使用namespace Private。显然没有什么可以阻止任何人使用这些名称空间的内容,但是这两个名称都传达了它们的内容不打算供一般消费的含义。
如此说来,一个简单的替代方法是打开func1并func2从免费函数模板到一些共同类的静态成员函数模板; 这样,helper可以简单地成为所述类的私有成员,对外界不可见:
struct funcs {
template<typename T>
static void func1(T const& value) {
// ...
helper(value);
}
template<typename T>
static void func2(T const& value) {
// ...
helper(value);
}
private:
template<typename T>
static void helper(T const& value) {
// ...
}
};
Run Code Online (Sandbox Code Playgroud)