Как заставить мой пользовательский тип работать с «циклами for на основе диапазона»?

Как и многие люди в наши дни, я пробовал различные возможности, которые предлагает C + 11. Один из моих любимых - «циклы на основе диапазона».

Я понимаю, что:

for(Type& v : a) { ... }

эквивалентно:

for(auto iv = begin(a); iv != end(a); ++iv)
{
  Type& v = *iv;
  ...
}

И что begin () просто возвращает a.begin () для стандартных контейнеров.

Но что, если я хочу сделать свой собственный тип «основанным на диапазоне для цикла» -знающим ?

Должен ли я просто специализироваться на begin () и end () ?

Если мой настраиваемый тип принадлежит пространству имен xml , я должен определить xml :: begin () или std :: begin () ?

Короче говоря, каковы рекомендации?

229
задан BЈовић 4 October 2012 в 04:04
поделиться