函数对象

函数对象或 functor,是任何类型实现运算符 ()。 此运算符称作 " 运算符 或有时 应用程序运算符。 标准模板库使用函数对象主要为排序条件用于在容器和算法。

函数对象提供两大优势条函数调用。 第一个是函数对象可以包含状态。 第二是函数对象属于类型并可用作模板参数。

创建函数对象

若要创建功能对象,请创建一个类型以及实现运算符 (),例如:

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 类型。 在调用函数对象和函数之间的相似之处是此术语函数对象的显示方式。

函数对象和容器

标准模板库。 <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 也可以创建拥有。

请参见

参考

标准模板库