В документации для boost.geometry Говорится
Примечание: предпочитайте использовать х = BG :: получить:<0> (point1);
(в отличие от x = point1.get<0> ();)
Я видел это в других документах. У меня вопрос почему? Это лучшая практика, вещь производительности или какая-то особенность? Это общее правило или специфическое для этой библиотеки?
Это не само по себе повышение, а современный дизайн C ++ API.
Не требуя функций-членов, вы можете адаптировать свои собственные классы и даже сторонние типы библиотек для работы с расширенным API по вашему выбору. (Таким образом, вы можете, например, сделать типы из сторонней библиотеки, сериализуемой в архив Boost Serialization).
Кроме того, делая функции свободными функциями, улучшается разделение зависимостей. Например.: fusion/tuple.hpp
не нужно зависеть от чего-либо связанного с IO, потому что потоковые операции являются свободными функциями и, следовательно, могут быть объявлены (и определены) в отдельном заголовке: fusion/tuple_io.hpp
,
Это также помогает инкапсуляции, потому что по умолчанию бесплатные функции не friend
с хост-класса (и поэтому не могут получить доступ к закрытым членам).
Бесплатные функции могут «делать правильные вещи» на основе ADL:
using std::swap;
swap(a, b); // will lookup `swap` in the namespaces that declare the parameter types
(несколько других пространств имен также используются для поиска)
Наконец, свободные функции могут, как правило, обслуживать группу типов, которые не обязательно должны быть связаны с ОО (наследование). Таким образом, бесплатные функции позволяют избежать дублирования кода.
редактировать Обращаясь к вопросу о том, почему вы должны предпочесть синтаксис не-член, если оба существуют:
.template
устранение неоднозначности в коде шаблона (как указано @Simple)Опять же: это не конкретное повышение.
std::swap()
как бесплатная функцияstd::begin()
а также std::end()
как свободные функцииstd::hash<>
, std::less<>
, std::greater<>
, std::equal_to<>
аналогичным образом обеспечивают точки настройки которые не навязчивы (но не функции конечно)Других решений пока нет …