5

我有一个类,它有一个返回计数的函数,如下所示:

class CTestClass
{
public:
    // ...
    size_t GetCount()const;
    // ...
};

在我的程序的某个地方,我有一个该类对象的向量。我有一个函数来获取总计数(CTestClass::GetCount() 的结果总和),像普通循环一样实现:

size_t sum = 0;
for(vector<CTestClass>::const_iterator it = v.begin(); it != v.end(); ++it)
{
    sum += it->GetCount();
}

我想重构它以使用标准库中可用的工具,我想到了accumulate. 我已经能够通过使用函数对象(简单)来做到这一点,但我几乎可以肯定它可以在不声明另一个对象的情况下完成(我没有 C++11 或 boost,所以没有 lambda,但我有 TR1)。
在寻找答案时,我找到了这些资源,但它们并没有解决问题:

  • 几乎是同一个问题,提供的答案是循环、累加和仿函数、累加和 lambda,但对 bind 等有未回答的引用。
  • 这个对类似问题的回答使用accumulate,plusbind, 但使用数据成员而不是成员函数。

那么,有没有办法使用绑定或类似的东西来做到这一点?

4

2 回答 2

7

我认为以下应该有效:

using namespace std;
using namespace std::tr1;
using namespace std::tr1::placeholders;

accumulate(v.begin(), v.end(), 0,
           bind(plus<size_t>(), _1, bind(&C::GetCount, _2))
);
于 2011-12-07T12:25:18.557 回答
2

这也有效:

class CTestClass
{
public:
    // ...
    size_t GetCount()const;
private:
    operator size_t() { return GetCount(); }
    // ...
    template <typename InputIterator, typename T>
    friend T std::accumulate(InputIterator, InputIterator, T);

};


std::vector<CTestClass> v;
// fill vector

size_t result = std::accumulate(v.begin(), v.end(), 0);

没有 TR1,没有绑定 :)

于 2011-12-07T12:43:48.017 回答