Compartir a través de


function (Clase)

Contenedor para un objeto al que se puede llamar.

Sintaxis

template <class Fty>
class function  // Fty of type Ret(T1, T2, ..., TN)
    : public unary_function<T1, Ret>       // when Fty is Ret(T1)
    : public binary_function<T1, T2, Ret>  // when Fty is Ret(T1, T2)
{
public:
    typedef Ret result_type;

    function();
    function(nullptr_t);
    function(const function& right);
    template <class Fty2>
        function(Fty2 fn);
    template <class Fty2, class Alloc>
        function(reference_wrapper<Fty2>, const Alloc& Ax);

    template <class Fty2, class Alloc>
        void assign(Fty2, const Alloc& Ax);
    template <class Fty2, class Alloc>
        void assign(reference_wrapper<Fty2>, const Alloc& Ax);
    function& operator=(nullptr_t);
    function& operator=(const function&);
    template <class Fty2>
        function& operator=(Fty2);
    template <class Fty2>
        function& operator=(reference_wrapper<Fty2>);

    void swap(function&);
    explicit operator bool() const;

    result_type operator()(T1, T2, ....., TN) const;
    const std::type_info& target_type() const;
    template <class Fty2>
        Fty2 *target();

    template <class Fty2>
        const Fty2 *target() const;

    template <class Fty2>
        void operator==(const Fty2&) const = delete;
    template <class Fty2>
        void operator!=(const Fty2&) const = delete;
};

Parámetros

Fty
Tipo de función que se va a contener.

Ax
Función de asignador.

Comentarios

La plantilla de clase es un contenedor de llamadas cuya signatura de llamada es Ret(T1, T2, ..., TN). Úselo para incluir una variedad de objetos a los que se puede llamar en un contenedor uniforme.

Algunas funciones miembro toman un operando que designa el objeto de destino deseado. Puede especificar ese operando de varias maneras:

fn: el objeto fn al que se puede llamar; después de la llamada, el objeto function contiene una copia de fn.

fnref: el objeto al que se puede llamar denominado por fnref.get(); después de la llamada, el objeto function contiene una referencia a fnref.get().

right: el objeto al que se puede llamar, de haberlo, mantenido por el objeto function right.

npc: un puntero nulo; después de la llamada, el objeto function está vacío

En todos los casos, INVOKE(f, t1, t2, ..., tN), donde f es el objeto al que se puede llamar y t1, t2, ..., tN son valores L de tipos T1, T2, ..., TN respectivamente, debe tener un formato correcto y, si Ret no es void, debe poder convertirse a Ret.

Un objeto function vacío no contiene ningún objeto al que se puede llamar ni ninguna referencia a un objeto al que se puede llamar.

Miembros

Constructores

Nombre Descripción
function Crea un contenedor que está vacío o almacena un objeto al que se puede llamar de tipo arbitrario con una signatura fija.

Typedefs

Nombre Descripción
result_type El tipo de valor devuelto del objeto al que se puede llamar almacenado.

Funciones

Nombre Descripción
assign Asigna un objeto al que se puede llamar a este objeto de función.
swap Intercambia dos objetos a los que se puede llamar.
Destino Comprueba si se puede llamar al objeto al que se puede llamar según lo especificado.
target_type Obtiene información de tipo en el objeto al que se puede llamar.

Operadores

Nombre Descripción
operator no especificado Comprueba si existe un objeto al que se puede llamar almacenado.
operator() Llama a un objeto al que se puede llamar.
operator= Reemplaza el objeto al que se puede llamar almacenado.

asignar

Asigna un objeto al que se puede llamar a este objeto de función.

template <class Fx, class Alloc>
    void assign(
        Fx _Func,
        const Alloc& Ax);

template <class Fx, class Alloc>
    void assign(
        reference_wrapper<Fx> _Fnref,
        const Alloc& Ax);

Parámetros

_Func
Un objeto al que se puede llamar.

_Fnref
Un contenedor de referencia que contiene un objeto al que se puede llamar.

Ax
Un objeto de asignador.

Comentarios

Las funciones miembro reemplazan al callable object mantenido por *this por el objeto al que se puede llamar pasado como el operand. Ambas asignan almacenamiento con el objeto de asignador Ax.

function

Crea un contenedor que está vacío o almacena un objeto al que se puede llamar de tipo arbitrario con una signatura fija.

function();
function(nullptr_t npc);
function(const function& right);
template <class Fx>
    function(Fx _Func);
template <class Fx>
    function(reference_wrapper<Fx> _Fnref);
template <class Fx, class Alloc>
    function(
        Fx _Func,
        const Alloc& Ax);

template <class Fx, class Alloc>
    function(
        reference_wrapper<Fx> _Fnref,
        const Alloc& Ax);

Parámetros

right
El objeto de función que se va a copiar.

Fx
El tipo del objeto al que se puede llamar.

_Func
El objeto al que se puede llamar que se va a encapsular.

Alloc
El tipo de asignador.

Ax
Asignador.

_Fnref
La referencia del objeto al que se puede llamar que se va a encapsular.

Comentarios

Los dos primeros constructores crean un objeto function vacío. Los siguientes tres constructores crean un objeto function que contiene el objeto al que se puede llamar que ha pasado como el operando. Los dos últimos constructores asignan almacenamiento con el objeto de asignador Ax.

Ejemplo

// std__functional__function_function.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
#include <vector>

int square(int val)
{
    return val * val;
}

class multiply_by
{
public:
    explicit multiply_by(const int n) : m_n(n) { }

    int operator()(const int x) const
    {
        return m_n * x;
    }

private:
    int m_n;
};

int main()
{
    typedef std::vector< std::function<int (int)> > vf_t;

    vf_t v;
    v.push_back(square);
    v.push_back(std::negate<int>());
    v.push_back(multiply_by(3));

    for (vf_t::const_iterator i = v.begin(); i != v.end(); ++i)
    {
        std::cout << (*i)(10) << std::endl;
    }

    std::function<int (int)> f = v[0];
    std::function<int (int)> g;

    if (f) {
        std::cout << "f is non-empty (correct)." << std::endl;
    } else {
        std::cout << "f is empty (can't happen)." << std::endl;
    }

    if (g) {
        std::cout << "g is non-empty (can't happen)." << std::endl;
    } else {
        std::cout << "g is empty (correct)." << std::endl;
    }

    return 0;
}
100
-10
30
f is non-empty (correct).
g is empty (correct).

operator no especificado

Comprueba si existe un objeto al que se puede llamar almacenado.

operator unspecified();

Comentarios

El operador devuelve un valor que se puede convertir a bool con un valor true solo si el objeto no está vacío. Úselo para comprobar si el objeto está vacío.

Ejemplo

// std__functional__function_operator_bool.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>

int neg(int val)
    {
    return (-val);
    }

int main()
    {
    std::function<int (int)> fn0;
    std::cout << std::boolalpha << "not empty == " << (bool)fn0 << std::endl;

    std::function<int (int)> fn1(neg);
    std::cout << std::boolalpha << "not empty == " << (bool)fn1 << std::endl;

    return (0);
    }
not empty == false
not empty == true

operator()

Llama a un objeto al que se puede llamar.

result_type operator()(
    T1 t1,
    T2 t2, ...,
    TN tN);

Parámetros

TN
Tipo del enésimo argumento de llamada.

tN
El enésimo argumento de llamada.

Comentarios

La función miembro devuelve INVOKE(fn, t1, t2, ..., tN, Ret), donde fn es el objeto de destino almacenado en *this. Úsela para llamar al objeto encapsulado al que se puede llamar.

Ejemplo

// std__functional__function_operator_call.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>

int neg(int val)
    {
    return (-val);
    }

int main()
    {
    std::function<int (int)> fn1(neg);
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
    std::cout << "val == " << fn1(3) << std::endl;

    return (0);
    }
empty == false
val == -3

operator=

Reemplaza el objeto al que se puede llamar almacenado.

function& operator=(null_ptr_type npc);
function& operator=(const function& right);
template <class Fty>
    function& operator=(Fty fn);
template <class Fty>
    function& operator=(reference_wrapper<Fty> fnref);

Parámetros

npc
Una constante de puntero nulo.

right
El objeto de función que se va a copiar.

fn
El objeto al que se puede llamar que se va a encapsular.

fnref
La referencia del objeto al que se puede llamar que se va a encapsular.

Comentarios

Los operadores reemplazan el objeto al que se puede llamar mantenido por *this por el objeto al que se puede llamar pasado como el operando.

Ejemplo

// std__functional__function_operator_as.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>

int neg(int val)
    {
    return (-val);
    }

int main()
    {
    std::function<int (int)> fn0(neg);
    std::cout << std::boolalpha << "empty == " << !fn0 << std::endl;
    std::cout << "val == " << fn0(3) << std::endl;

    std::function<int (int)> fn1;
    fn1 = 0;
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;

    fn1 = neg;
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
    std::cout << "val == " << fn1(3) << std::endl;

    fn1 = fn0;
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
    std::cout << "val == " << fn1(3) << std::endl;

    fn1 = std::cref(fn1);
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
    std::cout << "val == " << fn1(3) << std::endl;

    return (0);
    }
empty == false
val == -3
empty == true
empty == false
val == -3
empty == false
val == -3
empty == false
val == -3

result_type

El tipo de valor devuelto del objeto al que se puede llamar almacenado.

typedef Ret result_type;

Comentarios

Typedef es un sinónimo del tipo Ret en la signatura de llamada de la plantilla. Úselo para determinar el tipo de valor devuelto del objeto encapsulado al que se puede llamar.

Ejemplo

// std__functional__function_result_type.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>

int neg(int val)
    {
    return (-val);
    }

int main()
    {
    std::function<int (int)> fn1(neg);
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;

    std::function<int (int)>::result_type val = fn1(3);
    std::cout << "val == " << val << std::endl;

    return (0);
    }
empty == false
val == -3

swap

Intercambia dos objetos a los que se puede llamar.

void swap(function& right);

Parámetros

right
El objeto de función con el que intercambiar.

Comentarios

La función miembro intercambia los objetos de destino entre *this y right. Lo hace en tiempo constante y no inicia ninguna excepción.

Ejemplo

// std__functional__function_swap.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>

int neg(int val)
    {
    return (-val);
    }

int main()
    {
    std::function<int (int)> fn0(neg);
    std::cout << std::boolalpha << "empty == " << !fn0 << std::endl;
    std::cout << "val == " << fn0(3) << std::endl;

    std::function<int (int)> fn1;
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
    std::cout << std::endl;

    fn0.swap(fn1);
    std::cout << std::boolalpha << "empty == " << !fn0 << std::endl;
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
    std::cout << "val == " << fn1(3) << std::endl;

    return (0);
    }
empty == false
val == -3
empty == true

empty == true
empty == false
val == -3

Destino

Comprueba si se puede llamar al objeto al que se puede llamar según lo especificado.

template <class Fty2>
    Fty2 *target();
template <class Fty2>
    const Fty2 *target() const;

Parámetros

Fty2
El tipo de objeto de destino al que se puede llamar que se va a comprobar.

Comentarios

Los tipos de argumento Fty2 deben poder llamarse para los tipos de argumento T1, T2, ..., TN y el tipo de valor devuelto Ret. Si target_type() == typeid(Fty2), la función de plantilla miembro devuelve la dirección del objeto de destino; de lo contrario, devuelve 0.

Se puede llamar a un tipo Fty2 para los tipos de argumento T1, T2, ..., TN y el tipo de valor devuelto Ret si, para los lvalues fn, t1, t2, ..., tN de tipos Fty2, T1, T2, ..., TN, respectivamente, INVOKE(fn, t1, t2, ..., tN) tiene el formato correcto y, si Ret no es void, no se puede convertir en Ret.

Ejemplo

// std__functional__function_target.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>

int neg(int val)
    {
    return (-val);
    }

int main()
    {
    typedef int (*Myfun)(int);
    std::function<int (int)> fn0(neg);
    std::cout << std::boolalpha << "empty == " << !fn0 << std::endl;
    std::cout << "no target == " << (fn0.target<Myfun>() == 0) << std::endl;

    Myfun *fptr = fn0.target<Myfun>();
    std::cout << "val == " << (*fptr)(3) << std::endl;

    std::function<int (int)> fn1;
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
    std::cout << "no target == " << (fn1.target<Myfun>() == 0) << std::endl;

    return (0);
    }
empty == false
no target == false
val == -3
empty == true
no target == true

target_type

Obtiene información de tipo en el objeto al que se puede llamar.

const std::type_info& target_type() const;

Comentarios

La función miembro devuelve typeid(void) si *this está vacío; de lo contrario, devuelve typeid(T), donde T es el tipo del objeto de destino.

Ejemplo

// std__functional__function_target_type.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>

int neg(int val)
    {
    return (-val);
    }

int main()
    {
    std::function<int (int)> fn0(neg);
    std::cout << std::boolalpha << "empty == " << !fn0 << std::endl;
    std::cout << "type == " << fn0.target_type().name() << std::endl;

    std::function<int (int)> fn1;
    std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
    std::cout << "type == " << fn1.target_type().name() << std::endl;

    return (0);
    }
empty == false
type == int (__cdecl*)(int)
empty == true
type == void