close
Espacios de nombres
Variantes

std::not_fn

De cppreference.com
 
 
Biblioteca de servicios
 
Objetos función
Envoltorios de funciones
(C++11)
(C++11)
Aplicación parcial de funciones
(C++20)
(C++11)
Invocación de funciones
(C++17)(C++23)
Objeto función identidad
(C++20)
Envoltorios de referencias
(C++11)(C++11)
Envoltorios de operador transparentes
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
Negadores
(C++17)
Buscadores
Comparadores restringidos
Vinculadores y adaptadores antiguos
(hasta C++17)
(hasta C++17)
(hasta C++17)
(hasta C++17)
(hasta C++17)(hasta C++17)(hasta C++17)(hasta C++17)
(hasta C++20)
(hasta C++20)
(hasta C++17)(hasta C++17)
(hasta C++17)(hasta C++17)

(hasta C++17)
(hasta C++17)(hasta C++17)(hasta C++17)(hasta C++17)
(hasta C++20)
(hasta C++20)
 
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>
Definido en el archivo de encabezado <functional>
template< class F> /*no especificado*/ not_fn( F&& f );
(desde C++17)
(hasta C++20)
template< class F> constexpr /*no especificado*/ not_fn( F&& f );
(desde C++20)

Crea un envoltorio de llamada de reenvío que devuelve la negación del objeto invocable que contiene.

Parámetros

f - El objeto a partir del cual se construye el objeto Callable retenido por el envoltorio.
Requisitos de tipo
-
std::decay_t<F> debe satisfacer los requisitos de Callable y MoveConstructible.
-
Se requiere que std::is_constructible_v<std::decay_t<F>, F> sea true.

Valor de retorno

Un objeto función de tipo T no especificado. Tiene los siguientes miembros:

std::not_fn return type

Objetos miembro

El tipo de retorno de std::not_fn contiene un objeto miembro de tipo std::decay_t<F>.

Constructoes

<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
(1)
explicit T(F&& f); // solo exposición
(desde C++17)
(hasta C++20)
explicit constexpr T(F&& f); // solo exposición
(desde C++20)
T(T&& f) = default; T(const T& f) = default;
(2)
1) El constructor inicializa el objeto miembro (de tipo std::decay_t<F>) directamente, sin usar inicialización de lista, a partir de std::forward<F>(f). Lanza cualquier excepción lanzada por el constructor seleccionado.
2) Debido a que se requiere que std::decay_t<F> sea MoveConstructible, el envoltorio de llamada devuelto siempre es MoveConstructible, y es CopyConstructible si std::decay_t<F> es CopyConstructible.

Función miembro operator()

<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
(1)
template<class... Args> auto operator()(Args&&... args) & -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F>&, Args...>>()); template<class... Args> auto operator()(Args&&... args) const& -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F> const&, Args...>>());
(desde C++17)
(hasta C++20)
template<class... Args> constexpr auto operator()(Args&&... args) & noexcept(/*véase abajo*/) -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F>&, Args...>>()); template<class... Args> constexpr auto operator()(Args&&... args) const& noexcept(/*véase abajo*/) -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F> const&, Args...>>());
(desde C++20)
(2)
template<class... Args> auto operator()(Args&&... args) && -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F>, Args...>>()); template<class... Args> auto operator()(Args&&... args) const&& -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F> const, Args...>>());
(desde C++17)
(hasta C++20)
template<class... Args> constexpr auto operator()(Args&&... args) && noexcept(/*véase abajo*/) -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F>, Args...>>()); template<class... Args> constexpr auto operator()(Args&&... args) const&& noexcept(/*véase abajo*/) -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F> const, Args...>>());
(desde C++20)
1) Equivalente a return !std::invoke(fd, std::forward<Args>(args)...);
2) Equivalente a return !std::invoke(std::move(fd), std::forward<Args>(args)...);
(desde C++17)
(hasta C++20)
1) Equivalente en expresión a !std::invoke(fd, std::forward<Args>(args)...)
2) Equivalente en expresión a !std::invoke(std::move(fd), std::forward<Args>(args)...)
(desde C++20)

donde fd es el objeto miembro de tipo std::decay_t<F>

Equivalente en expresión

La expresión e es equivalente-en-expresión a la expresión f, si e y f tienen los mismos efectos, ambas potencialmente lanzan o ambas potencialmente no lanzan (es decir, noexcept (e) == noexcept(f)), y ambas son subexpresiones constantes o ambas no son subexpresiones constantes.

Excepciones

No lanza excepciones, a menos que que la construcción de fd lance.

Posible implementación

namespace detail {
    template<class F>
    struct not_fn_t {
        F f;
        template<class... Args>
        constexpr 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)...);
        }

        template<class... Args>
        constexpr 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>
        constexpr auto operator()(Args&&... args) &&
            noexcept(noexcept(!std::invoke(std::move(f), std::forward<Args>(args)...)))
            -> decltype(!std::invoke(std::move(f), std::forward<Args>(args)...))
        {
            return !std::invoke(std::move(f), std::forward<Args>(args)...);
        }

        template<class... Args>
        constexpr auto operator()(Args&&... args) const&&
            noexcept(noexcept(!std::invoke(std::move(f), std::forward<Args>(args)...)))
            -> decltype(!std::invoke(std::move(f), std::forward<Args>(args)...))
        {
            return !std::invoke(std::move(f), std::forward<Args>(args)...);
        }
    };
}

template<class F>
constexpr detail::not_fn_t<std::decay_t<F>> not_fn(F&& f)
{
    return { std::forward<F>(f) };
}

Notas

Se pretende que not_fn reemplace los negadores de los tiempos de C++03, std::not1 y std::not2.


Macro de Prueba de característica
__cpp_lib_not_fn

Ejemplo

Véase también

(en desuso en C++17)(eliminado en C++20)
Construye un objeto std::unary_negate personalizado.
(plantilla de función) [editar]
(en desuso en C++17)(eliminado en C++20)
Construye un objeto std::binary_negate personalizado.
(plantilla de función) [editar]