crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> У кого больше функциональных адаптеров, друг за другом...
ViGOur
  опции профиля:
сообщение 30.3.2011, 14:25
Сообщение #1


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Что, может попробуем посоревноваться кто больше осмысленных функциональных адаптеров друг за другом выстроит?
Например так:
std::list<int> listInt;
for( int n = 0; n < 100;++n)
   listInt.push_back(n);

std::list<int>::iterator pos = std::find_if( listInt.begin(), listInt.end(),
                                            std::not1( std::bind2nd( std::modulus<int>(), 2)));
...
где std::not1( std::bind2nd( std::modulus<int>(), 2)) - функциональные адаптеры, с помощью которых мы находим первый четный элемент списка...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.3.2011, 20:58
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


мы тут, понимаешь, к простоте и читаемости кода стремимся ;)

Сообщение отредактировал Алексей1153 - 31.3.2011, 7:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 30.3.2011, 22:29
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Я сейчас начал углубленное изучение STL, и окончательно убедился, что этот код все же читабелен! :)
Вот что не очень читабельно на первых порах, так это:
"compose.hpp"
template <class OP1, class OP2>
class compose_f_gx_t
: public std::unary_function<typename OP2::argument_type,
                              typename OP1::result_type>
{
  private:
    OP1 op1;    // process: op1(op2(x))
    OP2 op2;
  public:
    // constructor
    compose_f_gx_t(const OP1& o1, const OP2& o2)
     : op1(o1), op2(o2) {
    }

    // function call
    typename OP1::result_type
    operator()(const typename OP2::argument_type& x) const {
        return op1(op2(x));
    }
};

// Вспомогательная функция для композиционного адаптера compose_f_gx
template <class OP1, class OP2>
inline compose_f_gx_t<OP1,OP2>
compose_f_gx (const OP1& o1, const OP2& o2) {
    return compose_f_gx_t<OP1,OP2>(o1,o2);
}
"Пример использования (main.cpp)"
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>

int main()
{
    vector<int> coll;
    for (int i=1; i<=9; ++i) {
        coll.push_back(i);
    }
    PRINT_ELEMENTS(coll);
    // К каждому элементу прибавляем 10 и умножаем на 5, и выводим на печать в std::cout с пробелом в качестве разделителя
    transform (coll.begin(),coll.end(),
               ostream_iterator<int>(cout," "),
               compose_f_gx(bind2nd(multiplies<int>(),5),
                            bind2nd(plus<int>(),10)));
    cout << endl;
}
Кстати, compose.hpp из буста... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 31.3.2011, 7:55
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(ViGOur @ 31.3.2011, 0:29) *
Вот что не очень читабельно на первых порах, так это

а что тут нечитабельного? обычные темплейты... может, это с непривычки они кажутся сложными. но там нет ничего хитрого. главное, в синтаксисе не наделать опечаток. а то компилятор на ошибки в темплейтах выдаёт совершенно невменяемые сообщения и потом фиг найдёшь, что ему на самом деле не нравится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 31.3.2011, 21:35
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


И с непривычки и по первости они именно такими и кажутся! :)
Хотя попользовавшись чуть-чуть начинаешь понимаешь их удобство.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Ответить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 6:57