![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Operators revisitedBoost , ,
Каждый оператор C++ имеет специальный тип тега, связанный с ним. Например, оператор бинарных + имеет связанный с ним тип тега plus_op. Этот тег оператора используется для специализации:
классы шаблонов (см. unary_operator и binary_operator ниже). Специализации этих unary_operator и binary_operator являются фактическими рабочими лошадками, которые реализуют операции. Поведение каждого ленивого оператора зависит от специализации unary_operator и binary_operator. Предустановленные специализации соответствуют каноническим правилам оператора, смоделированным поведением целых чисел и указателей:
Special operators and extensibilityКонечно, при необходимости можно переопределить стандартное поведение оператора. Например, поведение std::cout не соответствует каноническому сдвигу левого оператора<< (т.е. rhs std::cout является изменчивой ссылкой). Странные шары, такие как этот, помещаются в special_ops.hpp. Там вы найдете специализации для различных классов, найденных в стандартном либе. Библиотека должна быть расширяемой. Пользователи могут реализовать свои собственные специализации, чтобы позволить другим библиотекам быть адаптированными для оценки частичной функции. Позже в разделе "Взаимодействие (с приложениями, библиотеками и фреймворками)" обсуждение будет сосредоточено на взаимодействии и расширении фреймворка. Operator tagsКаждый оператор C++ имеет соответствующий тип тега. Используется для специализации unary_operator и binary_operator (см. ниже). Тег также служит ленивым типом оператора, совместимым с композитом в качестве операции. Вот два примера тегов оператора: Унарный пример:
Бинарный пример:
Обратите внимание, что это снова отличные примеры сложной операции. Этот стиль специализированной функции вездесущ в рамках. Посмотрим, как будут работать классы шаблонов unary_operator Вот полный список тегов оператора:
unary_operatorКласс unary_operator реализует большинство унарных операторов C++. Каждая специализация в основном представляет собой простую статическую оценочную функцию плюс файл типа result_type, который определяет тип возврата оценочной функции. TagT является одним из тегов унарного оператора, и T является типом данных (аргументом), участвующим в операции. Вот пример:
Этот пример является именно тем, на что ссылался первый пример, который мы видели в разделе по тегам операторов. Только поведение встроенных типов C/C++ учитывается в специализациях, предоставляемых в operator.hpp. Для определяемых пользователем типов эти специализации могут по-прежнему использоваться при условии, что операторские перегрузки таких типов соответствуют стандартному поведению встроенных типов. Отдельный файл special_ops.hpp реализует больше специализаций STL. Другие более специализированные реализации unary_operator могут быть определены клиентом для конкретных типов тегов/данных унарного оператора. binary_operatorКласс binary_operator реализует большинство бинарных операторов C++. Каждая специализация в основном представляет собой простую статическую оценочную функцию плюс файл типа result_type, который определяет тип возврата оценочной функции. TagT является одним из тегов двоичного оператора выше T0, а T1 - это типы данных (аргументов), участвующие в операции. Вот пример:
Именно на этот пример ссылался второй пример, который мы видели в разделе о тегах операторов. higher_rank Только поведение встроенных типов C/C++ учитывается в специализациях, предоставляемых в operator.hpp. Для определяемых пользователем типов эти специализации могут по-прежнему использоваться при условии, что операторские перегрузки таких типов соответствуют стандартному поведению встроенных типов. Отдельный файл special_ops.hpp реализует больше специализаций STL. Другие более специализированные реализации unary_operator могут быть определены клиентом для конкретных типов тегов/данных унарного оператора. Все бинарные_операторы, кроме логических_and_op и логических_or_op, имеют статическую функцию, которая выполняет фактическую операцию. Логика_and_op и логическая_or_op d являются особенными, поскольку эти два оператора оцениваются по короткому замыканию.
rankКласс ранга имеет статическое постоянное «значение», которое определяет абсолютный ранг типа. Rank
Обратите внимание, что рейтинги 0..9999 зарезервированы фреймворком. Компьютер типа шаблона higher_rank
Т0 или Т1 возвращается в зависимости от того, кто имеет более высокий ранг. В некоторых операторских приложениях, таких как a + b, результатом является тот, который имеет более высокий рейтинг. Например, если a имеет тип int, а b имеет тип double, результат будет иметь тип double. Это средство также может быть весьма полезным для оценки некоторых функций. Например, если у нас есть функция сумма (a, b, c, d, e), мы можем вызвать этот тип компьютера, чтобы получить тип с самым высоким рангом:
Copyright © 2001-2002 Joel de Guzman Статья Operators revisited раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |