простой вопрос про предикаты
От: varnie  
Дата: 11.07.08 11:13
Оценка:
извиняюсь у ветеранов С++ за нубский вопрос, но нигде не нашел ответа, хотя многое перекопал.
укажите, плз, какой смысл имеет унаследование своего бинарного предиката от, скажем public std::binary_function<bool, xxx, xxx> ? что мы теряем в случае написания отдельного класса/структуры, реализующей предикат, без этого наследования?
или же это просто правило 'хорошего тона' примерно как совет наследовать по возможности все свои классы ексепшнов от std::exception ?
спасибо за пояснение.
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re: простой вопрос про предикаты
От: jazzer Россия Skype: enerjazzer
Дата: 11.07.08 11:19
Оценка:
Здравствуйте, varnie, Вы писали:

V>извиняюсь у ветеранов С++ за нубский вопрос, но нигде не нашел ответа, хотя многое перекопал.

V>укажите, плз, какой смысл имеет унаследование своего бинарного предиката от, скажем public std::binary_function<bool, xxx, xxx> ? что мы теряем в случае написания отдельного класса/структуры, реализующей предикат, без этого наследования?
V>или же это просто правило 'хорошего тона' примерно как совет наследовать по возможности все свои классы ексепшнов от std::exception ?
V>спасибо за пояснение.

Это нужно для того, чтоб у тебя в функторе появились разные типы, из которых наиважнейший — return_type. Остальные неважны.
с приходом boost::bind это все не особо нужно, в принципе, но иногда требуется: некоторые алгоритмы его юзают.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: простой вопрос про предикаты
От: Qbit86 Кипр
Дата: 11.07.08 11:19
Оценка:
Здравствуйте, varnie, Вы писали:

V>извиняюсь у ветеранов С++ за нубский вопрос, но нигде не нашел ответа, хотя многое перекопал.

V>укажите, плз, какой смысл имеет унаследование своего бинарного предиката от, скажем public std::binary_function<bool, xxx, xxx> ? что мы теряем в случае написания отдельного класса/структуры, реализующей предикат, без этого наследования?

В стандартных функторах объявлены typedef'ы вроде result_type, first_argument_type, etc (не помню точных названий, но как-то так). Неоторые алгоритмы требуют наличие этих typedef'ов.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: простой вопрос про предикаты
От: varnie  
Дата: 11.07.08 11:24
Оценка:
подведя черту, мы можем сказать что это правило хорошего тона, которое желательно соблюдать? (т.к. оно минимизирует кол-во теоретически возможных проблем при сопровождении/разростании кода?
и что за "нек. алгоритмы"? STL-ные?
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re: простой вопрос про предикаты
От: Alexander G Украина  
Дата: 11.07.08 11:28
Оценка:
Здравствуйте, varnie, Вы писали:

V>извиняюсь у ветеранов С++ за нубский вопрос, но нигде не нашел ответа, хотя многое перекопал.

V>укажите, плз, какой смысл имеет унаследование своего бинарного предиката от, скажем public std::binary_function<bool, xxx, xxx> ? что мы теряем в случае написания отдельного класса/структуры, реализующей предикат, без этого наследования?
V>или же это просто правило 'хорошего тона' примерно как совет наследовать по возможности все свои классы ексепшнов от std::exception ?
V>спасибо за пояснение.

Используется в адаптерах


struct condition
//  : public std::unary_function<int, bool>  // без этого не скомпилируется
{
  bool operator()(int) const { return false; }
};

std::vector<int> v;
std::find_if(v.begin(), v.end(), std::not1(condition()));
Русский военный корабль идёт ко дну!
Re[3]: простой вопрос про предикаты
От: jazzer Россия Skype: enerjazzer
Дата: 11.07.08 11:29
Оценка:
Здравствуйте, varnie, Вы писали:

V>подведя черту, мы можем сказать что это правило хорошего тона, которое желательно соблюдать? (т.к. оно минимизирует кол-во теоретически возможных проблем при сопровождении/разростании кода?

V>и что за "нек. алгоритмы"? STL-ные?

ну, я лично это не соблюдаю, просто руками вставляю typedef result_type.
остальные нафиг не нужны, нормальные связыватели (или замыкатели?) и буста/C++0x работают и так, и слава богу.
а если стандартные bind1st/2nd не работают — так им место на свалке (в секции deprecated стандарта)

а вот result_type частенько нужен, если у тебя, например, результат алгоритма зависит от результата функтора, или ты результат работы функтора сохраняешь для следующих итераций.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: простой вопрос про предикаты
От: varnie  
Дата: 11.07.08 12:02
Оценка:
спасибо ответившим, теперь все понял.
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.