Стандарт C ++ 1x устарел старые функции связывания STL в пользу более универсального std::bind
. Тем не менее, кажется, что std::not1
и std::not2
не являются устаревшими в пользу универсального std::not_
или чего-то еще. Реальность такова, что с <functional>
частью STL до C ++ 1x работать было действительно громоздко из-за 1) отсутствия лямбд, 2) того факта, что связующим и функторам отрицания требовался вложенный typedef argument_type
, что означает, что они не могут работать с обычными функциями, и 3) отсутствие шаблонов с переменными параметрами требовало отдельных функций связывания и отрицания в зависимости от количества аргументов.
C ++ 1x изменил все это, значительно улучшив полезность <functional>
. Но по какой-то причине C ++ 1x, кажется, улучшил все , кроме std::not1
и std::not2
. Действительно, было бы неплохо иметь стандартную универсальную функцию negate
, например:
template <class F>
class negation
{
public:
negation(F f) : m_functor(f) { }
template <class... Args>
bool operator() (Args&&... args) const
{
return (!m_functor(args...));
}
private:
F m_functor;
};
template <class F>
inline negation<F> not_(F f)
{
return negation<F>(f);
}
Это, конечно, будет устаревать std::not1
и std::not2
так же, как устаревшие связующие.
Вопрос (ы): 1) Я просмотрел черновик C ++ 1x и не вижу упоминаний об универсальной функции negate
. Я пропустил это? 2) Есть ли веская причина, по которой они добавили универсальный bind
и устарели старые связующие, но не смогли сделать то же самое для функций отрицания?