Это скорее вопрос чистоты кода, потому что у меня уже есть пример. Я делаю это в тонне кода, и создание всех этих лямбда-выражений (некоторые из которых одинаковы) начало меня раздражать.
Итак, учитывая структуру:
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
.
struct foo
, но у меня на самом деле тонна больше участников, так что в моем случае это было бы расточительно. Однако огромное предложение, если вы хотите напечатать его, я определенно дам вам голос, хотя, вероятно, не приму, поскольку это не решает мою проблему. - person Jonathan Mee   schedule 26.07.2017