2011-12-23 3 views
3

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

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

например:

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

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

Я мог бы сделать это частный методом, но тогда я должен был бы обеспечить каждый класс, который использует его с той же реализацией или сделать их друг класс ...

+2

Что касается обмена, мешающего другим функциям подкачки, вот почему пространства имен были изобретены, используйте их! Насколько я знаю, вы можете скрывать функции в файле заголовка, делая их закрытыми внутри класса или структуры. Вы можете создать структуру с этой функцией как частную и указать класс, который вы создаете как класс друга. – leetNightshade

ответ

5

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

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

6

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

Также есть std::swap, так что вам не нужно самостоятельно.