Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.228.40] |
|
Сообщ.
#1
,
|
|
|
Небольшая преамбула: собственно сама идея топика навеяна очередным вчерашним боданием с std::unary_negate и прочей живностью из <functional>. Помощь пришла со вполне ожидаемой стороны.
Суть проблемы Есть в STL такой заголовочный файл - functional. В нем реализована куча полезных функторов. Но вот незадача - по большей части эти функторы - вещи в себе. В частности, тот же самый std::unary_negate можно использовать только с функциональным объектом, класс которого унаследован от std::unary_function (впрочем, как и многие другие функторы из этого заголовочного файла). А потому конструкции типа: 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. |
Сообщ.
#2
,
|
|
|
А что вы думаете о функторах из Loki? ИМХО довольно мощное средство, особенно в связке с TYPELIST.
|
Сообщ.
#3
,
|
|
|
Цитата LONGOBARD @ А что вы думаете о функторах из Loki? это явно не в тему, там (Loki) описана реализация паттерна "делегат", а тут про готовые реализации таких выражений как equal, less, greater, и т.д. Просто небольшая путаница с термином "функтор", как с объектом к которому можно пременить операцию скобок. По этой теме можно еще почитать Майерса "Эффективное использование STL" |