Функторы и лямбды в C ++ - PullRequest
0 голосов
/ 09 ноября 2018
std::for_each(my_data.begin(), my_data.end(),
[&result](const auto & what) {
    result += what;
});

Это ответ, который я получил от Quora. Я спросил, почему C ++ принял лямбды. Кто-то ответил с этими двумя частями кода, выше, используя лямбды, и ниже, в противном случае. Предполагается, что они эквивалентны, а разница в коде подчеркивает преимущество лямбды.

template <typename T>
class add_to_impl {
    T & m_result;

    public:
    add_to_impl(T & to): m_result(to) {}
    void operator () (const T & what) { m_result += what; }
};

template <typename T>
add_to_impl<T> add_to(T & result) {
    return add_to_impl<T>(result);
}
// ... other bunch of stuff
// ... somewhere else ...
std::for_each(my_data.begin(), my_data.end(), add_to(result));

Однако я не вижу, как функция add_to будет генерировать поведение, эквивалентное лямбда-выражению.

При чтении лямбды «результат» представляется глобальной переменной. И в своей голове я думаю, что функция add_to должна быть реализована, как показано ниже, чтобы быть эквивалентной лямбда-выражению:

add_to_impl<T> result; //result being some global variable 
template <typename T>
void add_to(T & what) {
    result(what); // adding to result, matching what the lambda code does.
}

1 Ответ

0 голосов
/ 09 ноября 2018

Нет, отсутствие какого-либо другого контекста является ошибкой имени, поскольку в области видимости нет ничего, что называется result. Предположительно это заявлено в коде, не показанном.

Показанный объект функции dance равен лямбде, но, как отмечает @Someprogrammerdude, лучше написать что-то вроде

result = std::accumulate(my_data.begin(), my_data.end(), result);

при условии, что речь идет о типе, для которого +, = и += делают согласованные вещи

...