es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de extraer los bucles externos de múltiples funciones similares?

Quiero extraer los bucles for anidados de estas funciones de operador que son iguales excepto en una línea.

// Sumar dos matrices
Matrix& operator+=(const Matrix& other)
{
    for (int i = 0; i < this->m<em>rows; i++)
    {
        for (int j = 0; j < this->m</em>cols; j++)
        {
            (<em>this)(i, j) = (</em>this)(i, j) + other(i, j); // Única diferencia
        }
    }
    return *this;
}

// Restar dos matrices
Matrix& operator-=(const Matrix& other)
{<br>
    for (int i = 0; i < this->m<em>rows; i++)
    {
        for (int j = 0; j < this->m</em>cols; j++)
        {
            (<em>this)(i, j) = (</em>this)(i, j) - other(i, j); // Única diferencia
        }
    }
    return *this;
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Extrayendo los bucles for anidados de las funciones de operador en C++

    Como experto en TI en C++, podemos identificar que las dos funciones de operador, operator+=() y operator-=(), son muy similares, excepto por la línea dentro del bucle for interno. Este es un caso clásico de duplicación de código.

    Para extraer los bucles for anidados, podemos definir una nueva función que tome un operador como parámetro. La función aplicará el operador dado a cada elemento de las dos matrices.

    Aquí está nuestra solución:

    “`c++
    Matrix& applyOperator(const Matrix& other, function<int(int,int)> op)
    {
    for (int i = 0; i < this->m_rows; i++)
    {
    for (int j = 0; j < this->m_cols; j++)
    {
    (this)(i, j) = op((this)(i, j), other(i, j));
    }
    }
    return *this;
    }


    La función `applyOperator()` toma dos matrices como entrada y un operador en forma de función. La función del operador toma dos enteros y devuelve un entero. Podemos usar esto para pasar los operadores de suma y resta. Ahora podemos reescribir nuestras funciones originales `operator+=()` y `operator-=()` para llamar a la función `applyOperator()` con los operadores respectivos: ```c++ // Sumar dos matrices Matrix& operator+=(const Matrix& other) { return applyOperator(other, [](int a, int b) { return a + b; }); } // Restar dos matrices Matrix& operator-=(const Matrix& other) { return applyOperator(other, [](int a, int b) { return a - b; }); }

    Observa que estamos utilizando una función lambda para definir la función del operador de forma inline. Esta es una forma conveniente de definir una función corta en su lugar sin tener que crear una función separada.

    Al extraer los bucles for anidados en una función separada, hemos eliminado la duplicación de código y hemos hecho que nuestro código sea más legible y mantenible. Incluso podríamos reutilizar la función applyOperator() en otra parte de nuestro código si alguna vez necesitamos aplicar un operador diferente a dos matrices.</int(int,int)>

Comments are closed.