Если вы загляните в заголовок CImg, вы увидите, что этот код на самом деле является макросом, который преобразуется в:
#define cimg_forXY(img,x,y) cimg_forY(img,y) cimg_forX(img,x)
#define cimg_forX(img,x) for (int x=0; x<(int)((img).width); ++x)
#define cimg_forY(img,y) for (int y=0; y<(int)((img).height); ++y)
#define cimg_forZ(img,z) for (int z=0; z<(int)((img).depth); ++z)
#define cimg_forXYZ(img,x,y,z) cimg_forZ(img,z) cimg_forXY(img,x,y)
Это означает, что у вас будут следующие циклы:
for (int z=0; z<(int)((img).depth); ++z)
for (int y=0; y<(int)((img).height); ++y)
for (int x=0; x<(int)((img).width); ++x) {
}
Итак, теперь вы, вероятно, захотите сделать ссылку на координаты x, y и z или, что лучше, на указатель на данные при переходе, например
cimg_library::CImg<float> image;
//assign, etc
float* ptr = image->ptr();
cimg_forXYZ(S, x, y, z){
*ptr = *ptr + 10;
++ptr;
}
Я рекомендую вам прочитать заголовок CImg; это довольно элегантно. Вы получите много функциональности «бесплатно».