Я храню изображения как массивы, шаблоны, основанные на типе их элементов, например Image<unsigned>
или Image<float>
и т. Д. Часто мне нужно выполнять операции над этими изображениями; например, мне может потребоваться добавить два изображения или квадратное изображение (по-разному) и т. д. Все операции являются элементарными. Я хотел бы получить как можно ближе к написанию таких вещей, как:Как легко применить функцию к коллекции в C++
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
приведенном выше примере вне; также, я должен написать новый для каждого числа аргументов, которые я хотел бы пройти (что кажется неизбежным).
Любые мысли о том, как достичь этого (с минимальным условным кодом)?
я (1) ошибка: ожидается, тип спецификатор (1) ошибка: ожидается, '>' (2) Ошибка: аргументы шаблона по умолчанию не могут быть использованы в шаблонах функций (Я пронумеровал строки, основанные на вашем примере.) Я использую gcc v4.2.4. –