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