【发布时间】:2017-07-26 14:02:37
【问题描述】:
这更像是一个代码简洁问题,因为我在这里已经有一个示例。我在代码中做了大量的工作,所有这些 lambdas(其中一些是相同的)的创建已经开始让我厌烦了。
所以给定结构:
struct foo {
int b() const { return _b; }
int a() const { return _a; }
int r() const { return _r; }
const int _b;
const int _a;
const int _r;
};
我有一个指向它们的指针容器,比如说vector<foo*> foos,现在我想通过容器并获取其中一个字段的总和。
例如,如果我想要字段_r,那么我目前的做法是这样做:
accumulate(cbegin(foos), cend(foos), 0, [](const auto init, const auto i) { return init + i->r(); } )
我到处都在写这行。可以对此进行任何改进吗?我真的很想写这样的东西:
x(cbegin(foos), cend(foos), mem_fn(&foo::r));
我不认为标准提供了类似的东西。我显然可以编写它,但它需要读者找出我的可疑代码,而不是仅仅知道 accumulate 做了什么。
【问题讨论】:
-
我认为提供一个小实用功能没有问题。有时人们也必须在标准库中查找有关内容的信息。很少有人能背诵这一切。只要它写得干净且易于访问,为什么不在标准库上添加一个抽象呢?
-
@StoryTeller 现在我也倾向于这个。这个问题是我做之前的最后一站,感觉应该有更好的方法。
-
您是否考虑过一个类方法:“static void foo::acc4 (std::vector
foos)”一次执行所有 4 次累加? -
@DOUGLASO.MOEN 我没有......这对
struct foo来说是超级可行的,但我的成员实际上有 ton 更多的成员,所以这对我来说是一种浪费。不过,非常棒的建议,如果你想把它写出来,我肯定会给你一个赞成票,尽管可能不接受,因为它不能解决我的问题。 -
@StoryTeller 刚刚在 C++14 中发现了一些非常不可思议的东西。我认为这比函数更好:stackoverflow.com/a/45443542/2642059Thoughts?
标签: c++ stl sum containers accumulate