这是我从http://www.catonmat.net/blog/on-functors/复制的函子代码。

#include <algorithm>
#include <iostream>
#include <list>

class EvenOddFunctor {
    int even_;
    int odd_;
public:
    EvenOddFunctor() : even_(0), odd_(0) {}
    void operator()(int x) {
        if (x%2 == 0) even_ += x;
        else odd_ += x;
    }
    int even_sum() const { return even_; }
    int odd_sum() const { return odd_; }
};

int main() {
    EvenOddFunctor evenodd;

    int my_list[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    // ??? why assign
    evenodd = std::for_each(my_list,
                  my_list+sizeof(my_list)/sizeof(my_list[0]),
                  evenodd); // ???

    std::cout << "Sum of evens: " << evenodd.even_sum() << "\n";
    std::cout << "Sum of odds: " << evenodd.odd_sum() << std::endl;

    // output:
    // Sum of evens: 30
    // Sum of odds: 25
}

为什么像evanodd一样在操作之后需要将值分配回evenodd = std::for_each(my_list,对象?我以为,从std::for_each更新了evenodd对象,我不需要赋值操作,但是如果没有此赋值,结果将显示为0。

最佳答案

std::for_each按值接受函子,这意味着它将修改本地副本。分配会获取该本地副本,因此您实际上可以看到修改后的版本。

这很重要,因为您的函子具有您感兴趣的可变状态,尤其是evenodd.even_sumevenodd.odd_sum

07-26 03:37