На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
  
> Использование стандартных функторов , STL? Зачем? Boost!
    Небольшая преамбула: собственно сама идея топика навеяна очередным вчерашним боданием с std::unary_negate и прочей живностью из <functional>. Помощь пришла со вполне ожидаемой стороны.

    Суть проблемы
    Есть в STL такой заголовочный файл - functional. В нем реализована куча полезных функторов. Но вот незадача - по большей части эти функторы - вещи в себе. В частности, тот же самый std::unary_negate можно использовать только с функциональным объектом, класс которого унаследован от std::unary_function (впрочем, как и многие другие функторы из этого заголовочного файла). А потому конструкции типа:
    ExpandedWrap disabled
      std::string str="abcd  ABCD   12345";
      int non_alphas = std::count_if(str.begin(), str.end(), std::not1(std::isalpha));

    не прокатывают. :(
    Понятно, что в данном конкретном случае можно воспользоваться std::ptr_fun, но это только загромождает выражение.
    Помощь пришла с весьма ожидаемой стороны - со стороны boost'а.

    Решение проблемы
    Технологии, как известно, не стоят на месте. Давно уже в ходу шаблонное метапрограммирование и прочие радости жизни. Так почему бы ими не воспользоваться? Добрые разработчики библиотеки boost, видимо, тоже так подумали, и разработали файл functional.hpp (в boost 1.32 точно есть). Достаточно заменить
    #include <functional>
    на
    #include <boost/functional.hpp>

    и пользоваться одноименными функторами из пространства имен boost, а не std, как многие проблемы пропадают по мановению волшебной палочки. Функторы из boost-а (в отличии от stl-ных) гораздо более продвинуты в плане определения типов аргументов и возвращаемых значений. Если им скармливается указатель на обычную или статическую функцию, то типы аргументов и возвращаемого значения определяются автоматом без дополнительных "оборачиваний". Для функциональных объектов они требуют (как и stl) наследование их от std::unary_function или std::binary_function.
      А что вы думаете о функторах из Loki? ИМХО довольно мощное средство, особенно в связке с TYPELIST.
        Цитата LONGOBARD @
        А что вы думаете о функторах из Loki?

        это явно не в тему, там (Loki) описана реализация паттерна "делегат", а тут про готовые реализации таких выражений как equal, less, greater, и т.д. Просто небольшая путаница с термином "функтор", как с объектом к которому можно пременить операцию скобок. По этой теме можно еще почитать Майерса "Эффективное использование STL"
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0189 ]   [ 15 queries used ]   [ Generated: 25.04.24, 00:21 GMT ]