извиняюсь у ветеранов С++ за нубский вопрос, но нигде не нашел ответа, хотя многое перекопал.
укажите, плз, какой смысл имеет унаследование своего бинарного предиката от, скажем public std::binary_function<bool, xxx, xxx> ? что мы теряем в случае написания отдельного класса/структуры, реализующей предикат, без этого наследования?
или же это просто правило 'хорошего тона' примерно как совет наследовать по возможности все свои классы ексепшнов от std::exception ?
спасибо за пояснение.
Здравствуйте, varnie, Вы писали:
V>извиняюсь у ветеранов С++ за нубский вопрос, но нигде не нашел ответа, хотя многое перекопал. V>укажите, плз, какой смысл имеет унаследование своего бинарного предиката от, скажем public std::binary_function<bool, xxx, xxx> ? что мы теряем в случае написания отдельного класса/структуры, реализующей предикат, без этого наследования? V>или же это просто правило 'хорошего тона' примерно как совет наследовать по возможности все свои классы ексепшнов от std::exception ? V>спасибо за пояснение.
Это нужно для того, чтоб у тебя в функторе появились разные типы, из которых наиважнейший — return_type. Остальные неважны.
с приходом boost::bind это все не особо нужно, в принципе, но иногда требуется: некоторые алгоритмы его юзают.
Здравствуйте, varnie, Вы писали:
V>извиняюсь у ветеранов С++ за нубский вопрос, но нигде не нашел ответа, хотя многое перекопал. V>укажите, плз, какой смысл имеет унаследование своего бинарного предиката от, скажем public std::binary_function<bool, xxx, xxx> ? что мы теряем в случае написания отдельного класса/структуры, реализующей предикат, без этого наследования?
В стандартных функторах объявлены typedef'ы вроде result_type, first_argument_type, etc (не помню точных названий, но как-то так). Неоторые алгоритмы требуют наличие этих typedef'ов.
подведя черту, мы можем сказать что это правило хорошего тона, которое желательно соблюдать? (т.к. оно минимизирует кол-во теоретически возможных проблем при сопровождении/разростании кода?
и что за "нек. алгоритмы"? STL-ные?
Здравствуйте, 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()));
Здравствуйте, varnie, Вы писали:
V>подведя черту, мы можем сказать что это правило хорошего тона, которое желательно соблюдать? (т.к. оно минимизирует кол-во теоретически возможных проблем при сопровождении/разростании кода? V>и что за "нек. алгоритмы"? STL-ные?
ну, я лично это не соблюдаю, просто руками вставляю typedef result_type.
остальные нафиг не нужны, нормальные связыватели (или замыкатели?) и буста/C++0x работают и так, и слава богу.
а если стандартные bind1st/2nd не работают — так им место на свалке (в секции deprecated стандарта)
а вот result_type частенько нужен, если у тебя, например, результат алгоритма зависит от результата функтора, или ты результат работы функтора сохраняешь для следующих итераций.