我有一个类,其函数返回一个计数,如下所示:
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或者提升,所以没有lambda,但是我有TR1)。
在寻找答案时,我发现了这些资源,但他们没有解决问题:
accumulate
,plus
和
bind
,但使用数据成员而不是成员函数。 那么,有没有办法使用bind或类似的东西来做到这一点?
答案 0 :(得分: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))
);
答案 1 :(得分: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,没有绑定:)