在 getter 内对嵌套 getter 结果进行扁平化的最佳方法
Best way to do flattening of nested getter result inside getter
有时我的任务是查找 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。
有没有更短的方法来做到这一点?
我认为:
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);
有点啰嗦,但可能具有相似的性能。如何将它从 "Is there a foo?" 推广到 "Return all of the foos."
也相当清楚
有时我的任务是查找 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。 有没有更短的方法来做到这一点?
我认为:
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);
有点啰嗦,但可能具有相似的性能。如何将它从 "Is there a foo?" 推广到 "Return all of the foos."
也相当清楚