4

以下是完整清单中的相关代码:

#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

2 回答 2

2

CImg重载operator,返回一个CImgList对象,该对象是一个包含CImg作为操作数给出的两个对象的列表。该对象还重载operator,以允许将CImg对象添加到列表中。

表达式(src,gray1,gray2)等价于((src,gray1),gray2)。括号的内部集合(src,gray1),创建CImgList,然后(...,gray2)附加gray2到该列表,返回对同一列表的引用。CImgList有成员函数display

于 2013-01-22T13:06:17.377 回答
0

说重载运算符,() 必然意味着丑陋的设计是愚蠢的。有很多有用和聪明的方法可以重载这个操作符,CImg 做得很好。如果你说的总是“愚蠢”,你是否认为 C++ 标准会允许它?在这个例子中,C++ 代码读起来很好,肯定比写 CImgList(src,gray1,gray2).display(); 更简单(但等价);

由于 CImg 是一个加速图像处理算法编写的库(主要用于原型设计),这种构造绝对是有用的。

于 2013-01-22T17:56:04.323 回答