c++ - 如何仅使用 Element 成员函数和 STL 来累积容器中 Element 成员函数的结果?

标签 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 和 Binder 。我怎样才能做到这一点?我怎样才能有效做到这一点?我从 add_element 开始,但陷入了困境。

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

最佳答案

我认为您的问题不适用于。看看你有什么:一个小型单行函数 add_size 和对 std::accumulate 的调用。 有什么不喜欢的?

不知何故(可能出于公司原因)您被限制使用 Boost.Bind 或 Boost.Lambda,更不用说 C++11(它标准化了 std::bind 和 lambda 表达式)。

您希望消除这一点,转而使用 C++03 绑定(bind)器,因为 C++03 绑定(bind)器其表达能力非常有限(顺便说一句,这也是 Boost.Bind 和 Boost.Lambda 如此受欢迎的原因之一)并且需要比您目前拥有的更多的样板。看看这个appendix C++ Standard Reference book by Nicolai Jusuttis的。他实现了一个通用的 compose 模板,可以与 std::bind2nd 和 friend 们“很好地”合作。但看看他使用哪些 header 来实现这一点:对,就是 Boost.Bind header 。

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

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

关于c++ - 如何仅使用 Element 成员函数和 STL 来累积容器中 Element 成员函数的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16437733/

相关文章:

python lambda无法检测打包的模块

c++ - 使用C/C++宏生成函数签名

c++ - Visual Studio 2008 (C++) 内存泄漏检测不显示文件/方法位置 - 如何让它工作?

c++ - 需要帮助来重载运算符 +

c++ - vector 的 vector 到一维数组

c++ - 如果对象位于可能的最高地址怎么办

c++ - vector::erase 是否不适用于反向迭代器?

java - 简单 lambda 表达式代码的 "AssignmentOperator Expression"错误

c++ - 让纹理在 OpenGL 3.2 中工作

c# - Expression.Call 导致 "Static method requires null instance, non-static method requires non-null instance"