我有两节课,Base和Derived.我提供了一个函数,将函数应用于所有元素Base,以及另一个函数将函数应用于以下所有元素Derived:
#include <iostream>
#include <vector>
class Base {
typedef std::vector<int> Vec;
typedef Vec::const_iterator CIter;
CIter begin() const;
CIter end() const;
};
class Derived : public Base {
void add(int);
};
template<class F>
void processBase(const Base& b, F& f) {
for (Base::CIter it = b.begin(); it != b.end(); ++it) {
f(b, *it);
}
}
template<class F>
void processDerived(Derived* d, F& f) {
for (Base::CIter it = d->begin(); it != d->end(); ++it) {
f(d, *it);
}
}
Run Code Online (Sandbox Code Playgroud)
如何让一个函数调用另一个函数,以便我没有代码重复?(我只给出了一个最小的例子;在我的实际代码中,for循环有点复杂,并且代码在两个函数中完全重复.)
我必须模板processBase功能吗?或者有没有办法使用铸造?
假设const Base&vs. Derived*差异是错误,是的,您需要一个函数模板来使用正确的参数类型调用仿函数:
template <typename Collection, typename F>
void processCollection (Collection& col, F& f) {
for (typename Collection::CIter i=col.begin(); i!=col.end(); ++i) {
f (col, *i);
}
}
Run Code Online (Sandbox Code Playgroud)
processCollection适用于const或非const,Base或Derived对象.
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |