Для элегантности, инкапсуляции и использования ADL (Поиск зависимых аргументов) является общим для определения функции внутри пространства имен аргумента функции.
Предположим, у меня есть две библиотеки в разных пространствах имен. Есть три случая: 1) один из них является частью библиотеки, которую я контролирую, а другой - третьей стороной (например, Boost) или 2) я управляю обоими, или 3) я не контролирую ни одного (просто пишу "код клея" ).
У меня есть что-то вроде этого,
namespace ns_A{
struct A{...}; // something that looks like iostream
}
namespace ns_B{
struct B{...};
}
Я хочу "потопить" B в A, что является лучшим вариантом
namespace ???{ // what is more correct ns_A, or ns_B?
A& operator<<(A& a, B const& b){...}
}
или я должен помещать его в оба пространства имен?
namespace ns_B{
A& operator<<(A& a, B const& b){...}
}
namespace ns_A{
using ns_B::operator<<;
}
Какое наилучшее пространство имен для определения такой бинарной функции?
(Является ли пространство имен С++ 11 встроенным?)
(Я использую пример operator<<
, потому что, при прочих равных условиях, кажется интуитивно предпочтительнее namespace ns_B
.)