仿函数(functors/function objects)原理及使用

仿函数(functors,或名 function objects,函数对象),是 STL 六大组件(Components)的重要一环,如下图:


仿函数(functors/function objects)原理及使用_第1张图片

在STL的历史上,仿函数(functors)是早期的命名,C++ 标准定案后使用函数对象(function objects)的叫法。就实现意义而言, “函数对象”:一种具有函数性质的对象(本质为对象)。不过,就其行为而言,以及就中文用词的清晰漂亮和独特性而言,“仿函数”一次较为鲜明。

仿函数的应用场景主要在:作为算法组件中的相关函数接口的参数。更具体地说,STL 所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算第二个版本则表现出最泛化的演算流程,允许用户“以 template 参数来指定所要采行的策略”。就拿accumulate()(<numeric>头文件)来说,其一般行为(第一个版本)是将指定范围内的所有元素相加,第二个版本则允许你指定某种“操作”(甚至是相乘),取代第一个版本中的“相加”行为。

template<typename T>
struct multiplier :public std::binary_function<T, T, T>
{
    T operator() (const T& left, const T& right) const
    {
        return left*right;
    }
}

int main(int, char**)
{
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::cout << std::accumulate(v.begin(), v.end(), 1, multiplier<int>()) << std::endl;
                            // 1*1*2*3*4*5=120
    return 0;   
}

再举sort()为例,其第一版本是以operator<为排序时的元素位置调整依据,第二个版本则允许用户指定任何“操作”,务求排序后的两两相邻元素都能令该操作结果为 true

STL 仿函数的分类,

  • 若以操作数(operand)的个数划分,可分为一元(unary_function)和二元(binary_function)仿函数

  • 若以功能划分,可分为算术运算(Arithmetic)、关系运算(Rational)、逻辑运算(Logical)三大类

函数对象(function objects)的概念

所谓 function object (或者说 functor),是一个定义了 operator()的对象,

FunctionObjectType fo;
...
fo();

中的表达式fo()系调用函数对象 foopeator(),而非调用函数fo()

References

[1] STL源码剖析 第七章

你可能感兴趣的:(仿函数(functors/function objects)原理及使用)