2011-12-23 88 views
3

我想知道是否可以在头文件中定义一些函数,然后在同一个头文件中使用它们,同时将它们从其他东西中隐藏起来?例如,我可以先定义一些通用的帮助函数(特定于数据结构),然后在使用这些函数的相同头文件中定义一些数据结构?在头文件中隐藏非成员函数

如:

template<class T> 
void Swap(T &a, T &b) 
{ 
    T temp = a; 
    a = b; 
    b = temp; 
} 

但我不想Swap()与具有相同名称的其他功能干扰。

我可以让它变成一个私有方法,但后来我不得不提供具有相同实现使用它的每一个类或让他们的朋友类...

+2

关于交换干扰其他交换功能,这就是为什么命名空间被发明,使用它们!据我所知,你只能通过将它们隐藏在类或结构中来隐藏头文件中的函数。你可以使用这个函数作为一个私有结构,并指定你正在创建的类作为一个朋友类。 – leetNightshade 2011-12-23 21:45:58

回答

5

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

当然,如果您需要通过ADL提供功能,那么它将有生活在封装了ADL应该匹配的类的命名空间中。这是没有办法的。

6

传统,命名空间details用于实施保留的东西必须放在标题中。

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