[C++] ¿Qué es un delegado de C ++?


Answers

Un delegado es una clase que envuelve un puntero o referencia a una instancia de objeto, un método miembro de la clase de ese objeto a ser llamado en esa instancia de objeto, y proporciona un método para activar esa llamada.

Aquí hay un ejemplo:

template <class T>
class CCallback
{
public:
    typedef void (T::*fn)( int anArg );

    CCallback(T& trg, fn op)
        : m_rTarget(trg)
        , m_Operation(op)
    {
    }

    void Execute( int in )
    {
        (m_rTarget.*m_Operation)( in );
    }

private:

    CCallback();
    CCallback( const CCallback& );

    T& m_rTarget;
    fn m_Operation;

};

class A
{
public:
    virtual void Fn( int i )
    {
    }
};


int main( int /*argc*/, char * /*argv*/ )
{
    A a;
    CCallback<A> cbk( a, &A::Fn );
    cbk.Execute( 3 );
}
Question

¿Cuál es la idea general de un delegado en C ++? ¿Qué son, cómo se usan y para qué se utilizan?

Me gustaría aprender sobre ellos en una forma de 'caja negra', pero un poco de información sobre las agallas de estas cosas también sería genial.

Esto no es C ++ en su forma más pura o más limpia, pero noto que la base de código donde trabajo los tiene en abundancia. Espero comprenderlos lo suficiente, así que puedo usarlos y no tener que ahondar en el espantoso horror de la plantilla anidada.

Estos dos artículos de The Code Project explican lo que quiero decir, pero no de manera muy sucinta:




Equivalente de Windows Runtime de un objeto de función en C ++ estándar. Uno puede usar la función completa como un parámetro (en realidad, es un puntero de función). Se usa principalmente en conjunción con eventos. El delegado representa un contrato que los controladores de eventos cumplen mucho. Facilita el funcionamiento de un puntero a función.




Muy simplemente, un delegado proporciona la funcionalidad de cómo DEBERÍA funcionar un puntero a la función. Hay muchas limitaciones de indicadores de función en C ++. Un delegado utiliza algunos desaciertos de la plantilla detrás de las cámaras para crear una función de tipo plantilla-puntero-tipo-cosa que funciona de la manera que le gustaría.

es decir, puede configurarlos para que apunten a una función determinada y puede pasarlos y llamarlos cuando y donde quiera.

Aquí hay algunos muy buenos ejemplos:




Links