LINUX.ORG.RU

Параметры по умолчанию и STL

 , ,


0

4

Всем добра.

В C++ есть поддержка параметров по умолчанию. Внимание вопрос: почему в STL распространён подход написания функций без использования оного? Пример(как дословно в STL я пистаь не буду). Вместо

template<typename RAIterator, typename Predicate = std::less<typename std::iterator_traits<RAIterator>::value_type>>
void sort(RAIterator begin, RAIterator end, Predicate pred = Predicate())

Мы имеем две функции:

template<typename RAIterator, typename Predicate>
void sort(RAIterator begin, RAIterator end, Predicate pred)

template<typename RAIterator>
void sort(RAIterator begin, RAIterator end)

Не хотят возиться с этими параметрами по умолчанию и выдирать value_type из итератора(в данном случае). Разъясните, пожалуйста.

★★

Последнее исправление: zamazan4ik (всего исправлений: 1)

Возможно, чтобы избежать создания объекта std::less<T>? Версия без компаратора использует operator<, поэтому он ей не нужен.

Softwayer ★★
()
Ответ на: комментарий от Softwayer

Кстати может быть. Скорее всего это и есть причина. Правда не знаю, чего бояться создания обьекта std::less<T>... ну да ладно.

zamazan4ik ★★
() автор топика

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

У тебя может быть какой-нибудь обобщённый интерфейс, который принимает функцию от двух итераторов (куда можно передать и sort, и reverse, и ещё что-нибудь). Если бы sort был только от трёх параметров, он бы к этому интерфейсу не подошёл, пришлось бы обёртку городить.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)

Насколько я помню поделие трупа бегающей птицы.
Сделано, скорее всего, это для, какой-нибудь дичайшей, оптимизации.

anonymous
()

Попробуй скомпилировать свой пример с параметром по умолчанию. Не забудь функцию вызвать, что бы она инстанцировалась.

Marvel
()

почему в STL распространён подход написания функций без использования оного? Пример...

Кстати, есть полно примеров обратного. Скажем, аллокаторы в контейнерах именно опциональными параметрами сделаны.

DarkEld3r ★★★★★
()
Ответ на: комментарий от zamazan4ik

Они идут как шаблонные параметры, а не как параметры функции

Не только:

// 23.3.3.2, construct/copy/destroy:
deque() : deque(Allocator()) { }
explicit deque(const Allocator&);
explicit deque(size_type n, const Allocator& = Allocator());
deque(size_type n, const T& value, const Allocator& = Allocator());
template <class InputIterator>
deque(InputIterator first, InputIterator last, const Allocator& = Allocator());
deque(const deque& x);
deque(deque&&);
deque(const deque&, const Allocator&);
deque(deque&&, const Allocator&);
deque(initializer_list<T>, const Allocator& = Allocator());

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Не вспомнил. Спасибо. Тогда мне вдвойне непонятно.

zamazan4ik ★★
() автор топика

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

И это, параметры шаблонов по умолчанию были введены в C++11. А заменять две уже существующие функции на одну смысла мало.

xaizek ★★★★★
()
Ответ на: комментарий от intelfx

т. е. чтобы было удобнее передавать функции по указателю

в STL никто не передает функции по указателю, для этого есть лямбды и функторы

anonymous
()

А разве значение шаблона по-умолчанию для функций уже работает? Или моя криокамера протекла?

Torvus
()
Ответ на: комментарий от xaizek

без предиката можно делать больше предположений и что-нибудь оптимизировать

Если он шаблонный, как std::less (ну или просто его тело есть в той же единице трансляции), то никто не мешает просто проинлайнить тело operator() и получить тот же самый код (учитывая, что конструктор с деструктором не делают ничего, моё первое предположение, похоже, бредовое). Видимо, действительно наследие тех времён, когда у шаблонов не было параметров по умолчанию.

Softwayer ★★
()
Ответ на: комментарий от Softwayer

Я имел в виду оптимизации другого рода. Если на проверки по умолчанию накладываются дополнительные ограничения, то одна из реализаций могла бы этим воспользоваться. Правда примеров придумать не могу и в libstdcxx такого не вижу (они создают предикат по итератору и вызывают трёхаргументную версию, но я все алгоритмы, естественно, не проверял). Так что должно быть дело в шаблонных параметрах по умолчанию.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.