<div dir="ltr">MSVC supports for-each for 3 conditions:<div>    1. C-style array: int arr[10]; for each (int &i in arr) {}</div><div>    2. std::vector style iterators: vector<int> v; for each (int &i in v) {}</div>
<div>    3. The most complex one, the one like in C#:</div><div><br></div><div><div>#include <iostream></div><div><br></div><div>#define ARRAY_SIZE 3</div><div>int arr[ARRAY_SIZE] = { 1, 3, 5 };</div><div><br></div>
<div>struct Enumerator {</div><div>  __declspec(property) int& Current;</div><div>  int& GetCurrent() { return arr[index]; }</div><div><br></div><div>  bool MoveNext() { index++; return index < ARRAY_SIZE; }</div>
<div><br></div><div>  Enumerator() { index = -1; }</div><div>  int index;</div><div>};</div><div><br></div><div>struct Collection {</div><div>  Enumerator GetEnumerator() { return Enumerator(); }</div><div>};</div><div><br>
</div><div>int main() {</div><div>  Collection c;</div><div style>  // Output: 1 \n 3 \n 5 \n</div><div>  for each (int& i in c) {</div><div>    std::cout << i << "\n";</div><div>  }</div><div>}</div>
</div><div><br></div><div style>      The class that is "foreach"ed must have a method which returns a enumerator class.</div><div style>      And this enumerator class must have a property named "Current" and a "bool MoveNext()".</div>
<div style><br></div><div style>for each (T elem in collection) stmt</div><div style><br></div><div style>      is translated to:</div><div style><br></div><div style>{</div><div style>  auto&& enumerator = collection.getEnumerator();</div>
<div style>  while (enumerator.MoveNext()) {</div><div style>    T elem = enumerator.Current; // Current is a property!!!</div><div style>    stmt</div><div style>  }</div><div style>}</div><div style><br></div><div style>
1. This patch only solves (3).</div><div style>2. Enumerator class should have "Current" as a property, but for simplicity I just translate to enumarator.GetCurrent(), instead of enumerator.Current</div><div style>
3. The logic is kind of mixed up with C++11 for-range loop. So there may be some warnings like "for-range loop is C++11 extension", while we are using foreach...</div><div style><br></div><div style>This patch is proved to behave correctly UNDER CORRENT CODE, and is used in our product generation.</div>
<div><div><br></div>-- <br>Best Regards, Tong Shen (沈彤)
</div></div>