Скрытие не-членских функций в заголовочных файлах - PullRequest
3 голосов
/ 24 декабря 2011

Мне интересно, могу ли я определить некоторые функции в заголовочном файле, а затем использовать их в том же заголовочном файле, скрывая их от чего-либо еще?

Например, могу ли я сначала определить некоторые общие вспомогательные функции (специфичные для структур данных), а затем определить некоторые структуры данных в том же заголовке, которые используют эти функции?

например:

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

Но я не хочу, чтобы Swap() мешал другим функциям с таким же именем.

Я мог бы сделать это закрытым методом, но тогда мне пришлось бы предоставить каждому классу, использующему его, одну и ту же реализацию или сделать их классом друга ...

Ответы [ 2 ]

6 голосов
/ 24 декабря 2011

Традиционно пространство имен details используется для зарезервированных реализацией вещей, которые должны идти в заголовке.

Кроме того, есть std::swap, так что вам не нужно ничего.

5 голосов
/ 24 декабря 2011

Обычно вы не можете полностью скрыть функцию от других клиентов, но вы можете поместить ее в собственное пространство имен, чтобы она не мешала клиентскому коду. Обычная практика - сделать пространство имен внутренним пространством имен вашего основного пространства имен библиотеки и назвать его details или что-то подобное.

Конечно, если вам нужно, чтобы функция была доступна через ADL, тогда имеет , чтобы жить в пространстве имен, охватывающем классы, которым ADL должен соответствовать. Обойти это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...