如何仅使用元素成员函数和STL在容器中积累来自元素成员函数的结果

How to accumulate results from a member function of a Element in a Container using only Element member functions and STL?

本文关键字:函数 元素 成员 结果 何仅使 STL      更新时间:2023-10-16

我有一个元素的容器,每个元素都有它的size()成员函数。我已经设法通过编写二进制操作add_size来积累容器元素的总大小:

#include <algorithm>
#include <vector>
#include <functional>
#include <numeric>
#include <iostream>
class A
{
    int size_ ; 
    public: 
        A ()
            :
                size_(0)
        {}
        A (int size)
            :
                size_(size)
        {}
        int size() const
        {
            return size_; 
        }
};
template<typename Type>
class add_element 
{
    Type t_; 
    public: 
        add_element(Type const & t)
            :
                t_(t)
        {}
        void operator()(Type & t)
        {
            t += t_; 
        }
};
int add_size (int i, const A& a)
{
    return i+=a.size();
}
using namespace std;
int main(int argc, const char *argv[])
{
    typedef vector<A> Vector;
    Vector v; 
    v.push_back(A(10));
    v.push_back(A(5));
    v.push_back(A(7));
    v.push_back(A(21));
    v.push_back(A(2));
    v.push_back(A(1));
    int totalSize = accumulate(v.begin(), v.end(), 0, add_size);
    std::cout << totalSize << endl;
    return 0;
}

这给出了正确的输出:

46

和我想做的是做不定义二进制操作add_size 只是为size成员函数,但使用mem_fun和绑定器。我该怎么做呢?我怎样才能有效地做到?我从add_element开始,然后卡住了。

我需要在c++ 03中工作的解决方案。

我相信你的问题是不适定的。看看你有什么:一个小的单行函数 add_size和一个对std::accumulate的调用。有什么不喜欢的?

你在某种程度上(可能是公司的原因)被限制使用Boost。绑定或增强。Lambda,更不用说c++ 11了(它标准化了std::bind和Lambda表达式)。

您希望消除它,以支持c++ 03绑定,这些绑定在的表达性上受到严重限制(顺便说一句,这是Boost的一个原因。绑定和提升。Lambda非常流行),并且需要比现在更多的样板文件。请看Nicolai Jusuttis编写的c++标准参考书的附录。他实现了一个通用的compose模板,可以很好地与std::bind2nd和朋友一起工作。但是看看他用了哪些头文件来实现它:对,Boost。绑定的。

最好的方法是简单地复制Boost。Bind和/或Boost。Lambda,将它们放在您自己的源代码树中,并将名称空间重命名为您公司的名称空间。检查是否与Boost License一致。Boost甚至有一个bcp工具来为您提取所有包含的依赖项。然后,只需使用您刚刚"编写"的bind或lambda工具编写您需要的任何内容。

TL;DR:不要重新发明轮子。熟悉Boost