Я храню изображения в виде массивов, настроенных на основе типа их элементов, таких как Image<unsigned>
или Image<float>
и т. Д. Часто мне нужно выполнять операции с этими изображениями; например, мне может понадобиться добавить два изображения или квадратное изображение (поэлементно) и так далее. Все операции являются поэлементными. Я хотел бы максимально приблизиться к написанию таких вещей, как:
float Add(float a, float b) { return a+b; }
Image<float> result = Add(img1, img2);
и даже лучше, такие вещи, как
complex ComplexCombine(float a, float b) { return complex(a, b); }
Image<complex> result = ComplexCombine(img1, img2);
или
struct FindMax {
unsigned currentMax;
FindMax(): currentMax(0) {}
void operator(unsigned a) { if(a > currentMax) currentMax = a; }
};
FindMax findMax;
findMax(img);
findMax.currentMax; // now contains the maximum value of 'img'
Теперь я явно не могу этого сделать; Я написал что-то, чтобы я мог позвонить:
Image<float> result = Apply(img1, img2, Add);
но я не могу найти общий способ определения типа возвращаемого объекта функции / функции, поэтому мой приведенный выше пример ComplexCombine
отсутствует; Кроме того, я должен написать новый для каждого числа аргументов, которые я хотел бы передать (что кажется неизбежным).
Есть мысли о том, как этого добиться (используя как можно меньше стандартного кода)?