函数对象

函数对象或 functor,是任何类型实现运算符 ()。 此运算符引用 调用运算符 或在某些情况下 应用程序运算符。 标准模板库 (STL) 使用函数对象主要用作排序条件的容器和算法。

函数对象提供两个主要优点与直线段的函数调用。 第一是函数对象可以包含状态。 第二个是函数对象是类型可以用作模板参数。

函数创建对象

若要创建函数对象,创建类型并实现 operator(),如:

class Functor
{
public:
    int operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    Functor f;
    int a = 5;
    int b = 7;
    int ans = f(a, b);
}

main 函数的最后一行演示如何调用函数对象。 此调用看起来与调用函数,即,但实际调用 Functor 类型的 operator()。 在调用函数对象和函数之间的此相似术语是函数对象的显示方式。

函数对象和容器

标准模板库 (STL) 在 <functional> 头文件包含一些函数对象。 这些函数对象的可作为容器的一个排序条件。 例如,set 容器声明如下:

template <
    class Key,
    class Traits=less<Key>,
    class Allocator=allocator<Key> >
class set

第二个模板函数参数是 less对象。 此函数返回 true 对象,则第一个参数传递给它比被传递的第二个参数太少。 因为一些容器排序元素的容器,需要比较情况下,这两个元素,并使用函数对象是实现的。 您可以定义自己函数创建对象并指定自己的容器的排序条件在模板列表的容器。

函数对象和算法

使用功能对象的另一种用法在算法。 例如,remove_if 算法如下声明:

template<class ForwardIterator, class Predicate>
    ForwardIterator remove_if(
        ForwardIterator _First,
        ForwardIterator _Last,
        Predicate _Pred
    );

remove_if 中的最后参数是返回布尔值的函数对象 ( 谓词)。 如果函数对象的结果为 true,则迭代器访问的元素从容器中移除 _First 和 _Last。 在 <functional> 标题可以使用声明的任何函数对象为参数 _Pred 也可以创建自己。

请参见

参考

标准模板库