Namespaces
Variants

std::experimental:: not_fn

From cppreference.net
Определено в заголовочном файле <experimental/functional>
template < class F >
/*unspecified*/ not_fn ( F && f ) ;
(TS фундаментальной библиотеки v2)

Создает оболочку вызова с переадресацией, которая возвращает дополнение вызываемого объекта, который она хранит.

Содержание

Параметры

f - объект, из которого создаётся Callable объект, хранящийся в обёртке

Возвращаемое значение

Пусть FD будет std:: decay_t < F > и fd будет lvalue типа FD , созданное из std:: forward < F > ( f ) .

not_fn возвращает передающую обёртку вызова fn неопределённого типа, такую что fn ( a1, a2, ..., aN ) эквивалентно ! INVOKE ( fd, a1, ..., aN ) , где INVOKE — операция, описанная в Callable .

Возвращаемая обёртка вызова всегда является MoveConstructible и является CopyConstructible , если FD является CopyConstructible .

Примечания

Если fd не является Callable , или std:: is_constructible < FD, F > :: value не равно true , поведение не определено.

Исключения

Не генерирует исключений, если только конструкция fd не генерирует исключение.

Возможная реализация

namespace detail {
    template<class F>
    struct not_fn_t {
        F f;
        template<class... Args>
        auto operator()(Args&&... args)
            noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
            -> decltype(!std::invoke(f, std::forward<Args>(args)...)) {
            return !std::invoke(f, std::forward<Args>(args)...);
        }
        // перегрузка с cv-квалификаторами для улучшения качества реализации
        template<class... Args>
        auto operator()(Args&&... args) const
            noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
            -> decltype(!std::invoke(f, std::forward<Args>(args)...)) {
            return !std::invoke(f, std::forward<Args>(args)...);
        }
        template<class... Args>
        auto operator()(Args&&... args) volatile
            noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
            -> decltype(!std::invoke(f, std::forward<Args>(args)...)) {
            return !std::invoke(f, std::forward<Args>(args)...);
        }
        template<class... Args>
        auto operator()(Args&&... args) const volatile
            noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
            -> decltype(!std::invoke(f, std::forward<Args>(args)...)) {
            return !std::invoke(f, std::forward<Args>(args)...);
        }
    };
}
template<class F>
detail::not_fn_t<std::decay_t<F>> not_fn(F&& f) { return { std::forward<F>(f) }; }

Примечания

not_fn предназначен для замены негаторов эпохи C++03 std::not1 и std::not2 .

Смотрите также

(C++17)
создает функциональный объект, который возвращает дополнение результата функционального объекта, который он содержит
(шаблон функции)