Используйте `using` для точек настройки
Причина
Для нахождения функциональных объектов и функций, определённых в отдельном пространстве имён, для «настройки» общей функции.
Пример
Рассмотрим swap. Это общая функция (стандартной библиотеки) с определением, которое будет работать практически для любого типа. Однако желательно определять специфические swap() для конкретных типов. Например, общий swap() будет копировать элементы двух обмениваемых vector-ов, тогда как хорошая специфическая реализация не будет копировать элементы вообще.
namespace N {
My_type X { /* ... */ };
void swap(X&, X&); // оптимизированный swap для N::X
// ...
}
void f1(N::X& a, N::X& b)
{
std::swap(a, b); // вероятно, не то, что мы хотели: вызывает std::swap()
}
std::swap() в f1() делает именно то, о чём мы просили: вызывает swap() из пространства имён std. К сожалению, это, вероятно, не то, что нам нужно. Как сделать так, чтобы рассматривался N::X?
void f2(N::X& a, N::X& b)
{
swap(a, b); // вызывает N::swap
}
Но это может быть не то, что нам нужно для обобщённого кода. Там мы, как правило, хотим конкретную функцию, если она существует, и общую, если нет. Это делается путём включения общей функции в поиск функции:
void f3(N::X& a, N::X& b)
{
using std::swap; // делаем std::swap доступным
swap(a, b); // вызывает N::swap, если существует, иначе std::swap
}
Контроль
Маловероятно, за исключением известных точек настройки, таких как swap. Проблема в том, что как неквалифицированный, так и квалифицированный поиск имеют свои применения.