Вот соответствующий код из полный список:
#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
Функция-член применяется к каждому из объектов в списке через запятую?
CImg
перегрузки operator,
который возвращает CImgList
объект, который представляет собой список, содержащий два CImg
объекты даны как операнды. Этот объект также перегружает operator,
позволять CImg
объекты, которые будут добавлены в список.
Выражение (src,gray1,gray2)
эквивалентно ((src,gray1),gray2)
, Внутренний набор скобок, (src,gray1)
создать CImgList
, а потом (...,gray2)
присоединяет gray2
в этот список, возвращая ссылку на тот же список. CImgList
имеет функцию-член display
,
Сказать, что оператор перегрузки, () обязательно подразумевает некрасивый дизайн, глупо.
Есть много полезных и умных способов перегрузить этот оператор, и CImg делает это на отлично. Вы представляете, что стандарт C ++ позволил бы это, если бы он всегда был «глупым», как вы говорите?
В этом примере код C ++ читается очень хорошо, он определенно более прост (но эквивалентен), чем написание
CImgList (SRC, GRAY1, gray2) .display ();
Поскольку CImg — это библиотека для ускорения написания алгоритмов обработки изображений (используется в основном для создания прототипов), этот вид конструкции определенно полезен.