根据this问题的第一个答案,下面的仿函数在传递给foreach后应该能够保留一个值(我无法编译示例中的struct Accumulator,因此构建了一个类)。

class Accumulator
{
    public:
        Accumulator(): counter(0){}
        int counter;
        void operator()(const Card & c) { counter += i; }
};

示例用法(根据示例)
// Using a functor
Accumulator acc;
std::for_each(_cards.begin(), _cards.end(), acc);
// according to the example - acc.counter contains the sum of all
// elements of the deque

std::cout << acc.counter << std::endl;
_cards 实现为 std::deque<Card> 。无论 _cards 得到多长时间,acc.counter 完成后 for_each 为零。当我逐步进入调试器时,我可以看到计数器在递增,但是这与 acc 按值传递有关吗?

最佳答案

这只是 asked here

原因是(如您所料) std::for_each 复制其仿函数,并调用它。但是,它也会返回它,因此如上面链接的答案所述,使用 for_each 的返回值。

就是说 ,你只需要使用 std::accumulate :

int counter = std::accumulate(_cards.begin(), _cards.end(), 0);

仿函数和 for_each 在这里不正确。

对于您的使用(计算一些,忽略其他),您可能需要提供自己的仿函数并使用 count_if :
// unary_function lives in <functional>
struct is_face_up : std::unary_function<const Card&, const bool>
{
    const bool operator()(const card& pC) const
    {
        return pC.isFaceUp(); // obviously I'm guessing
    }
};

int faceUp = std::count_if(_cards.begin(), _cards.end(), is_face_up());
int faceDown = 52 - faceUp;

和 C++0x lambda 的乐趣(只是因为):
int faceUp = std::count_if(_cards.begin(), _cards.end(),
                            [](const Card& pC){ return pC.isFaceUp(); });

好多了。

关于c++ - 当传递给 std::for_each 时,仿函数可以保留值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2102187/

10-11 18:15