Tengo que cargar una matriz de doubles
de un archivo, multiplicar cada elemento por un valor en una tabla (diferentes valores para diferentes elementos), hacer algún trabajo en él, invertir la multiplicación (es decir , divide) y luego guarda los datos nuevamente en el archivo.Cómo pasar operadores como parámetros
Actualmente implemento el proceso de multiplicación y división en dos métodos separados. Ahora hay algo de trabajo extra detrás de la escena, pero aparte de las declaraciones específicas donde ocurre la multiplicación/división, el resto del código es idéntico. Como se puede imaginar, con este enfoque debe tener mucho cuidado al realizar cualquier cambio. El código circundante no es trivial, por lo que es un caso de editar manualmente cada método o copiar los cambios de un método al otro y recordar cambiar los operadores * y /.
Después de demasiadas llamadas cerradas, estoy harto de esto y me gustaría realizar una función común que implemente la lógica común y dos funciones de envoltura que pasan a cada operador para usar como parámetro.
Mi planteamiento inicial era utilizar los punteros de función:
void MultiplyData(double data)
{ TransformData(data, &(operator *)); }
void DivideData(double data)
{ TransformData(data, &(operator /)); }
void TransformData(double data, double (*func)(double op1, double op2))
{ /* Do stuff here... */ }
Sin embargo, no puedo dejar pasar los operadores como punteros (es esto porque es un operador en un tipo nativo?), Así que trataron de usar objetos de función. Al principio pensé que multiplies
y divides
funtores en <functional>
serían ideales:
void MultiplyData(double data)
{
std::multiplies<double> multFunct;
TransformData(data, &multFunct);
}
void DivideData(double data)
{
std::divides<double> divFunct;
TransformData(data, &divFunct);
}
void TransformData(double data, std::binary_function<double, double, double> *funct)
{ /* Do stuff here... */ }
Como se puede ver que estaba tratando de utilizar un puntero de clase base para pasar el funtor polimórfica. El problema es que std::binary_function
no declara un miembro operator()
para implementar las clases secundarias.
¿Hay algo que me falta, o es la solución para implementar mi propia jerarquía de funtores (que realmente parece más problemática de lo que vale)?
¿Qué es 'TransformData'? –
'TransformData' es mi propia función que transforma' datos' usando la función apuntada por 'funct'. –