Мне нужно загрузить массив из doubles
из файла, умножить каждый элемент на значение в таблице (разные значения для разных элементов), выполнить некоторую работу над ним, инвертировать умножение (то есть , разделите), а затем сохраните данные обратно в файл.Как передать операторов как параметры
В настоящее время я реализую процесс умножения и деления двумя разными способами. Теперь есть некоторая дополнительная работа за кулисами, но помимо конкретных утверждений, где происходит умножение/деление, остальная часть кода идентична. Как вы можете себе представить, при таком подходе вы должны очень осторожно вносить какие-либо изменения. Окружающий код не является тривиальным, поэтому его либо случай вручную редактирует каждый метод, либо копирует изменения от одного метода к другому и запоминает изменение операторов * и /.
После слишком большого количества вызовов я устал от этого и хотел бы сделать общую функцию, которая реализует общую логику и две функции оболочки, которые передают, какой оператор использовать в качестве параметра.
Мой первоначальный подход использовать указатели на функции:
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... */ }
Однако, я не могу передать операторы как указатели (это потому, что она является оператором на собственный тип?), Так что я пытался использовать объекты функции. Сначала я подумал, что multiplies
и divides
функторы в <functional>
было бы идеально:
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... */ }
Как вы можете видеть, что я пытался использовать указатель на базовый класс передать функтор полиморфно. Проблема заключается в том, что std::binary_function
не объявляет члену operator()
для реализации дочерних классов.
Есть ли что-то, что мне не хватает, или это решение для реализации моей собственной исполнительской иерархии (что действительно кажется более трудным, чем того стоит)?
Что такое 'TransformData'? –
'TransformData' - моя собственная функция, которая преобразует' data', используя функцию, обозначенную 'funct'. –