Однако, если мы вместо этого определимоператор()принять аргумент Предиката_тип немодифицированным, это было бы бесполезно неэффективно, если бы это был тип значения; аргумент был бы скопирован дважды - один раз при вызовеunary_negateоператор(), и снова, когдаоператор()называется адаптированной функцией.
Как бы мы хотели доказатьоператору()зависит от того, является ли аргументПредикатассылкой. Если это ссылка, мы хотим объявить ее простоargument_type; если это значение, мы хотим объявить ееconst argument_type&.
Шаблон класса Boostcall_traitsсодержитparam_typetypedef, который использует частичную специализацию для принятия именно этого решения. Если мы объявимоператоракак
Желаемый результат был бы достигнут - мы бы исключили ссылки на ссылки без потери эффективности. На самом деле, фактическая декларация несколько сложнее из-за использования признаков объекта функции, но эффект остается прежним.
Limitations
Как характеристики объекта функции, так и черты вызова, используемые для реализации этих улучшений, зависят от частичной специализации, эти улучшения доступны только на компиляторах, которые поддерживают эту функцию. С другими компиляторами отрицатели в этой библиотеке ведут себя очень похоже на те, что в Стандарте —ptr_funпотребуется адаптировать функции, и ссылок на ссылки не избежать.
Пересмотрено02 Декабря 200602
December, 2006[ORIG_END] -->
Авторское право и копия; 2000 Cadenza New Zealand Ltd.
Статья Boost Function Object Adapter Library раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.