STL的很多算法都要用到functor,这些functor一般很短、作用很局限,最好就像临时变量一样,定义在使用的地方。但是C++不支持函数嵌套,所以只能用内部类实例,然后设法把内部类实例“提取”出来做functor。

下面是一组提取一元functor的模板:


template
class UnaryFunction: public std::unary_function<_Arg, _Result>
{
public:
virtual _Result operator()(const _Arg &u) const = 0;
};

template
class AnyUnaryFunction
{
UnaryFunction<_Arg, _Result> & f;
public:
AnyUnaryFunction(UnaryFunction<_Arg, _Result> & g) : f(g) {}
_Result operator()(const _Arg &u) const { return f(u); }
};

用法:


struct remove_direct_pass: public UnaryFunction
{
bool operator() (const ActiveBehavior & act) const { return act.mDetailType == BDT_Pass_Direct; }
} remove_direct_pass;

mActiveBehaviorList.remove_if(AnyUnaryFunction(remove_direct_pass));

同理还有提取二元functor的模板:


template
class BinaryFunction: public std::binary_function<_Arg1, _Arg2, _Result>
{
public:
virtual _Result operator()(const _Arg1 &u, const _Arg2 &v) const = 0;
};

template
class AnyBinaryFunction
{
BinaryFunction<_Arg1, _Arg2, _Result> & f;
public:
AnyBinaryFunction(BinaryFunction<_Arg1, _Arg2, _Result> & g) : f(g) {}
_Result operator()(const _Arg1 &u, const _Arg2 &v) const { return f(u, v); }
};