Re[2]: STL алгоритмы: for_each_if
От: lomezych  
Дата: 09.02.04 17:48
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Во первых, переделаем in_range:

AD>
AD>template <class T>
AD>bool in_range (const T& _min, const T& _max, const T& val )
AD>{
AD>  return ( val >= _min && val <= _max);
AD>}
AD>

Было бы наверно лучше описать "in less<> terms". Хотя ладно... это не главное.

AD>Теперь при помощи буста твоя задача решаема:

AD>
AD>  for_each_if
AD>  (
AD>    sequence.begin(),
AD>    sequence.end(),
AD>    boost::mem_fn(&Foo::generator),
AD>    boost::bind
AD>    (
AD>      in_range<bar>,
AD>      boost::bind(&Foo::mf, _1, 1),
AD>      boost::bind(&Foo::mf, _1, 2),
AD>      10 // а для какого числа будем искать вхождение в диапазон? Я заменил его на 10
AD>    )  
AD>  );
AD>


AD>Правда, в задаче не понятно, какое число нужно передать в in_range для выяснения, входит ли оно в диапазон.


Да, блин, сорри... писал в попыхах... опечатался...На самом деле надо вот как:
min и мах — это как раз подставляемые значения.. а для выяснения, входит ли в диапазон — это как раз должно быть значение возвращаемое Foo::mf. Т.е. как я понял должно быть вот так:
for_each_if
(
    sequence.begin(),
    sequence.end(),
    boost::mem_fn(&Foo::generator),
    boost::bind
    (
        in_range<bar>,
        min,    // тут всё
        max,    // ясно
        boost::bind(&Foo::mf, _1, value_passed_to_Foo_mf_function) // что собсна проверяем, входит ли в диапазон
    )  
);


Значит теперь усложним задачу. Получилось так, что надо предварительно надо перед сравнением переделать. Допустим есть функция (может быть как и член Foo, так и некая static).
baz barTobaz(bar);

Те меня интересует можно ли будет написать что-то вроде:
for_each_if
(
    sequence.begin(),
    sequence.end(),
    boost::mem_fn(&Foo::generator),
    boost::bind
    (
        in_range<baz>,
            min_baz,    // тут всё
            max_baz,    // ясно
            boost::bind(
                ptr_fn(barTobaz), // не уверен что в booste'е именно так
                _1,
                boost::bind(&Foo::mf, _1, value_passed_to_Foo_mf_function)  // что собсна проверяем, входит ли в диапазон
            )
    )  
);

С boost'ом я не очень знаком... Но решение конечно достаточно простое... Спасибо ArtDenis'у.
Но хотелось бы всё-таки уложиться в рамки стандарта STL.

Спасибо.... ждём-с ответа.
... << RSDN@Home 1.1.3 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.