Здравствуйте, IDm, Вы писали:
IDm>добрый день. IDm>Предположим есть такой класс: IDm>struct A IDm>{ IDm> vector<int> v;
IDm> bool pred (int);
IDm> A (); IDm>};
IDm>Как использовать метод pred в алгоритмах.
IDm>например так: IDm>A::A () IDm>{ IDm> ... IDm> find_if (v.begin(), v.end(), pred); IDm> ... IDm>} IDm>ясно, что так работать не будет... IDm>А как сделать что б работало?
IDm>Благодарю за ответы.
Попробуйте добавить static к определению pred.
Если не прокатит, сделайте pred функтором:
struct Pred
{
bool operator () ( int ) const {...}
};
//...
find_if( v.begin(), v.end(), Pred() );
А можно аналогично через mem_fun. I> I> Да в том-то и дело, что я знаю, что как-то через mem_fun сделать можно, I> но как, я низнаю... Поэтому и спрашиваю.
Если я не ошибаюсь, то адаптеры mem_fun, mem_fun_ref нужны для того, чтобы вызывать функции-члены объектов, хранящихся в контейнере. Т.к. у тебя в контейнере хранятся объекты типа int, у которых нет функций-членов, то mem_fun, mem_fun_ref для них неприменимы
P> Если я не ошибаюсь, то адаптеры mem_fun, mem_fun_ref нужны для того, чтобы вызывать функции-члены объектов, хранящихся в P> контейнере. Т.к. у тебя в контейнере хранятся объекты типа int, у которых нет функций-членов, то mem_fun, mem_fun_ref для них P> неприменимы
Если класс A имеет функцию-член bool pred(int), то boost::bind(&A::pred,this)) создаст функтор с одним параметром типа int. find_if
требует именно такой.
P>> Если я не ошибаюсь, то адаптеры mem_fun, mem_fun_ref нужны для того, P>> чтобы вызывать функции-члены объектов, хранящихся в контейнере. Т.к. у P>> тебя в контейнере хранятся объекты типа int, у которых нет P>> функций-членов, то mem_fun, mem_fun_ref для них неприменимы AG> Если класс A имеет функцию-член bool pred(int), то AG> boost::bind(&A::pred,this)) создаст функтор с одним параметром типа AG> int. find_if требует именно такой.
Так против boost::bind я ничего не имею.
А вот mem_fun, mem_fun_ref в случае со встроенными типами бессмыленны
P>> Так против boost::bind я ничего не имею. P>> А вот mem_fun, mem_fun_ref в случае со встроенными типами бессмыленны AG> AG> Ну почему же? AG> AG> Вот несколько синтетический пример:
хъ
Гм, действительно. Про стандартные биндеры я не подумал
Здравствуйте, IDm, Вы писали:
IDm>Да в том-то и дело, что я знаю, что как-то через mem_fun сделать можно, но как, я низнаю... IDm>Поэтому и спрашиваю.
Пардон, не учёл и ошибся.
Я имел ввиду boost::mem_fn (а не похожий std::mem_fun). Он применяется, когда нужно из метода создать функтор, имеющий явный аргумент — указатель на класс, и используется обычно в тех же алгоритмах, только с перебором классов, например:
std::list<A> o;
...
for_each(o.begin(),o.end(),boost::mem_fn(&A::method));//вызвать для каждого класса i->method();
Всё это можно реализовать и через boost::bind (что я и делаю), потому я и забыл уже, для чего служат mem_fn и mem_fun.
А в данном конкретном случае mem_fun/mem_fn тебе нафиг не нужен.