【问题标题】:Executing member function on each comma-separated object在每个逗号分隔的对象上执行成员函数
【发布时间】:2025-12-14 01:20:08
【问题描述】:

这是来自full listing的相关代码:

#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 成员函数如何应用于逗号分隔列表中的每个对象?

【问题讨论】:

    标签: c++ cimg


    【解决方案1】:

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

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

    【讨论】:

    • 很好地解释了看起来非常丑陋的设计。像这样重载operator, 对我来说似乎是纯粹的混淆邪恶。
    【解决方案2】:

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

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

    【讨论】: