Одинарное и бинарное отрицание - PullRequest
7 голосов
/ 06 апреля 2011

Стандарт 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 и устарели старые связующие, но не смогли сделать то же самое для функций отрицания?

Ответы [ 2 ]

6 голосов
/ 06 апреля 2011
  1. Вы не пропустили это.

  2. Неопровержимая причина? Это зависит от того, кого вы спрашиваете. Отсутствие этой функциональности обсуждалось, но не очень поздно. Хм ... Я не могу найти документы на этот счет, их может и не быть.

Лучшее решение для этого (imho) - добавить оператор! () Для привязки. Но к тому времени, когда это произошло, комитет уже не собирался добавлять новые функции в C ++ 11. Возможно, это будет в техническом отчете.

О, вот документы:

http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 2010 / n3224.html # GB97

1 голос
/ 06 апреля 2011

Фактически, если не официально, все старой системы привязки функциональных объектов устарели, поскольку лямбда-выражения являются гораздо лучшим решением.Я нахожу более любопытным, что они потрудились обновить bind и все остальное вообще.

Скорее всего, вы обнаружите, что это потому, что оригинальный boost::bind не предоставил такой negate функция, и весь новый механизм связывания TR1 / C ++ 0x основан на этом, и никто не заметил, что not отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...