Преобразование Итератора C ++ в Итератор по Члену (Выбрать итератор?) - PullRequest
2 голосов
/ 03 августа 2010

В C # я могу создать итератор (или IEnumerable в C # land), который берет другого итератора и выбирает элемент исходного типа:

class ParentType
{
    public MemberType member { get; private set; }
}

// And somewhere else

IEnumerable<MemberType> getMembers(IEnumerable<ParentType> parents)
{
    for each (ParentType parent in parents)
        yield return parent.member;
}

Как мне сделать аналогичную операцию в C ++, где я хочу в основном взять итератор типа и вернуть итератор, который выполняет итерацию для определенного члена?

1 Ответ

0 голосов
/ 23 февраля 2011

Хм, с LINQ это еще проще:

var m = from p in parents
 select p.member;

или

var m = parents.Select(_ => _.member);

К сожалению, вы не можете писать ленивые перечисления, которые легко из коробки в C ++ ...Не прибегая к внешней библиотеке, вы можете написать «нетерпеливый» селектор (но без локальной лямбды):

std::transform(
 parents.begin(), parents.end(),
 std::back_inserter(members), [] (const parent& p) -> member {
  return p.member;
 });
...