Выполнение функции-члена для каждого объекта, разделенного запятыми

Вот соответствующий код из полный список:

#include "CImg.h"using namespace cimg_library;

int main() {
CImg<unsigned char> src("Tulips.jpg");
int width = src.width();
int height = src.height();
int depth = src.depth();

//New grayscale images.
CImg<unsigned char> gray1(width,height,depth,1);
CImg<unsigned char> gray2(width,height,depth,1);

// ...

(src,gray1,gray2).display("RGB to Grayscale");
}

Как работает линия (src,gray1,gray2).display("RGB to Grayscale"); Работа? Как display Функция-член применяется к каждому из объектов в списке через запятую?

4

Решение

CImg перегрузки operator, который возвращает CImgList объект, который представляет собой список, содержащий два CImg объекты даны как операнды. Этот объект также перегружает operator, позволять CImg объекты, которые будут добавлены в список.

Выражение (src,gray1,gray2) эквивалентно ((src,gray1),gray2), Внутренний набор скобок, (src,gray1)создать CImgList, а потом (...,gray2) присоединяет gray2 в этот список, возвращая ссылку на тот же список. CImgList имеет функцию-член display,

2

Другие решения

Сказать, что оператор перегрузки, () обязательно подразумевает некрасивый дизайн, глупо.
Есть много полезных и умных способов перегрузить этот оператор, и CImg делает это на отлично. Вы представляете, что стандарт C ++ позволил бы это, если бы он всегда был «глупым», как вы говорите?
В этом примере код C ++ читается очень хорошо, он определенно более прост (но эквивалентен), чем написание
CImgList (SRC, GRAY1, gray2) .display ();

Поскольку CImg — это библиотека для ускорения написания алгоритмов обработки изображений (используется в основном для создания прототипов), этот вид конструкции определенно полезен.

0