隐藏头文件中的非成员函数

xcr*_*ypt 3 c++ templates

我想知道我是否可以在头文件中定义一些函数然后在同一个头文件中使用它们,同时将它们隐藏在其他任何东西中?

例如,我可以首先定义一些通用辅助函数(特定于数据结构),然后在使用这些函数的同一个头中定义一些数据结构吗?

例如:

template<class T>
void Swap(T &a, T &b)
{
  T temp = a;
  a = b;
  b = temp;
}
Run Code Online (Sandbox Code Playgroud)

但我不想Swap()干涉其他具有相同名称的功能.

我可以把它变成一个私有方法,但是我必须为每个使用它的类提供相同的实现,或者让它们成为朋友类...

Pup*_*ppy 6

传统上,命名空间details用于必须包含在头部中的实现保留的东西.

此外,还有一个std::swap,所以不需要你自己的.


CB *_*ley 5

您通常无法完全从其他客户端隐藏该功能,但您可以将其放在自己的命名空间中,以便它不会干扰客户端代码.通常的做法是使命名空间成为主库命名空间的内部命名空间,并调用它details或类似的东西.

当然,如果你需要通过ADL提供函数,那么它必须存在于包含ADL应该匹配的类的命名空间中.没有办法解决这个问题.