如何仅使用Element成员函数和STL从Container中的Element的成员函数累积结果?

时间:2013-05-08 09:59:15

标签: c++ stl lambda bind function-object

我有一个元素容器,每个元素都有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

我想要的是而不是为size成员函数定义二进制操作add_size ,而是使用mem_fun和binders。我怎样才能做到这一点?我怎样才能有效?我从add_element开始并陷入困境。

我需要在C ++ 03中使用该解决方案。

1 个答案:

答案 0 :(得分:2)

我相信你的问题不适合。看看你有什么:小单行功能 add_size和对std::accumulate的调用。 什么不喜欢?

你以某种方式(可能是因为公司原因)限制使用Boost.Bind或Boost.Lambda,更不用说C ++ 11(标准化std::bind和lambda表达式)。

你想要消除那些支持C ++ 03绑定器,这些绑定器表现力非常有限(这是BTW Boost.Bind和Boost.Lambda如此受欢迎的一个原因)和需要比现在更多的样板。请查看appendixC++ Standard Reference book by Nicolai Jusuttis。他实现了一个与compose和朋友“很好”合作的通用std::bind2nd模板。但是看看他用来实现它的标题:对,Boost.Bind那些。

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

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