在getter中对嵌套getter结果进行展平的最佳方法

时间:2016-06-29 11:01:33

标签: c++ range-v3

有时我的任务是查找getter返回的值中的某个嵌套getter是否具有某些属性。 经典的c ++会是这样的:

for (const auto& label: labels) 
  for (const auto& artist: label.artists()) 
    if (artist.name = "Arcade Fire")
       return true;
return false;

使用范围执行此操作的最佳方法是什么? 我觉得这样的事情可能有用:

 labels|  transform (&Label::artists) | join | transform(&Artist::name) | join | find_if_fn([](){/*...*/}) ;

但是它很长,(部分原因是你必须编写Class:member_fn而不是.member_fn。 有没有更短的方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

我想这个:

using namespace ranges;
auto rng = labels | view::transform(&Label::artists) | view::join;
return find(rng, "Arcade Fire", &Artist::name) != end(rng);

以相当直接的方式完成工作。一个view::filter公式:

using namespace ranges;
auto rng = labels | view::transform(&Label::artists) | view::join |
    view::filter([](const Artist& a){ return a.name() == "Arcade Fire"; });
return !empty(rng);

有点啰嗦,但可能有类似的表现。如何从“有没有foo?”来概括它也是相当清楚的。 “归还所有的泡沫。”