(对于具体的编译器/平台上下文,请在 x86_64 上使用 GCC 4.7 和 Ubuntu 12.04)
给定一些函数 f:
void f(int x, int y);
int nx = ...;
int ny = ...;
迭代从 (0,0) 到 (nx,ny) 的每个值 (x,y) 的一种方法是:
for (int x = 0; x < nx; x++)
for (int y = 0; y < ny; y++)
f(x,y);
让它编译为一些生成的代码 Q1。
我们将编写一个函数 g 使得:
for (auto it : g(Z))
f(it.x, it.y);
编译为代码 Q2。
是否可以编写 g 使得 Q2 与 Q1 一样有效?如果是,如何?如果不是,我们能得到的最接近的是什么?
如果有帮助,您可以将 auto 更改为 auto& 或 auto&&。
如果有帮助,您也可以将 it.x 更改为 it.x(),并将 it.y 更改为 it.y()。
(回想一下,基于范围的 for 的扩展只是您选择的类似迭代器的类型:C++11:基于范围的 for 语句:“range-init”生命周期?)