Почему Boost рекомендует использовать основные функции над функциями-членами?

В документации для boost.geometry Говорится

Примечание: предпочитайте использовать х = BG :: получить:<0> (point1);
(в отличие от x = point1.get<0> ();)

Я видел это в других документах. У меня вопрос почему? Это лучшая практика, вещь производительности или какая-то особенность? Это общее правило или специфическое для этой библиотеки?

4

Решение

Это не само по себе повышение, а современный дизайн 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)
  • Опять же: это не конкретное повышение.

    • C ++ 03 имел std::swap() как бесплатная функция
    • C ++ 11 вводит std::begin() а также std::end() как свободные функции
    • std::hash<>, std::less<>, std::greater<>, std::equal_to<> аналогичным образом обеспечивают точки настройки которые не навязчивы (но не функции конечно)
14

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]