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