函数对象

科技工作者之家 2020-11-17

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。又称仿函数。

定义重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。又称仿函数。1

简介函数对象(function object)是一个程序设计的对象允许被当作普通函数来调用。

函数对象与函数指针相比,有两个优点:第一是编译器可以内联执行函数对象的调用;第二是函数对象内部可以保持状态。

函数式程序设计语言还支持闭包,例如,first-class函数支持在其创建时用到的函数外定义的变量的值保持下来,成为一个函数闭包。1

C++ STL中的函数对象C++的STL中的众多algorithm,非常依赖于函数对象处理容器的元素。因此,STL预定义了许多函数对象、谓词(predicate)、以及用于复合(composite)函数对象的binder、member function adapter、 pointer to function adapters、 negaters、 function objects base structure。由于STL中的algorithm使用函数对象作为参数时,一般都是传值调用,所以函数对象应该仔细设计其复制构造函数。2

预定义的函数对象C++98在头文件functional中定义了下述函数对象: plus() 结果为(param1 + param2) minus() 结果为(param1 - param2) multiplies() 结果为(param1 * param2) divides() 结果为(param1 / param2) modulus() 结果为(param1% param2)2

谓词(predicate)返回布尔值(或者可以隐式转换为布尔值)的函数对象。用于STL中的algorithm时,谓词应该是无状态的( stateless)函数对象,即谓词的结果不依赖于内部的数据成员。这是因为STL中的algorithm不保证内部实现时对传入的谓词要复制多少次。 C++98在头文件functional中定义了下述谓词:

equal_to() 结果为(param1 == param2)

not_equal_to() 结果为(param1!= param2)

less() 结果为 (param1

greater() 结果为(param1 > param2)

less_equal() 结果为 (param1 = param2)

logical_not() 结果为 (!param1)

logical_and() 结果为 (param1 && param2)

logical_or() 结果为 (param1 || param2)2

Function Adapter用于组合(combine)、变换(transform)、操作(manipulate)函数对象、特定参数值、或者特定函数。进一步细分为:

Binder

C++98在头文件functional中定义了两个函数bind1st与bind2nd,返回值为binder1st、binder2nd类型。用于把二元函数对象分别绑定第一个、第二个参数后成为单元函数对象。

Negater

negate把一个作为谓词的函数对象取反。C++98在头文件functional中定义了两个函数not1与not2,返回值为unary_negate、binary_negate类型。

Member function adapter

Member function adapter用于把类的成员函数用作STL中的algorithm的参数。C++98在头文件functional中定义了:

函数mem_fun,返回值为mem_fun_t类型,用于通过一个类对象指针来调用成员函数指针。

函数mem_fun_ref,返回值为mem_fun_ref_t类型,用于通过一个类对象引用来调用成员函数指针。

Pointer to function adapter

函数指针适配器(Pointer to function adapter)是把函数指针包装为一个函数对象,以便STL中的algorithm用函数对象作为统一的参数类型,不用再考虑以函数指针作为传入参数的情形。C++98在头文件functional中定义了:

函数ptr_fun,返回值为pointer_to_unary_function类型,包装了一个单参数的函数指针。

重载函数ptr_fun,返回值为pointer_to_binary_function类型,包装了一个双参数的函数指针。2

Function Object Base函数对象基类(Function Object Base)定义在头文件functional中,用作STL的预定义的与函数对象有关的各个类的基类,其中定义了几个类型,分别表示函数调用的各个参数类型、结果类型。

unary_function类,定义了2个类型:argument_type、result_type;

binary_function类,定义了3个类型:first_argument_type、second_argument_type、result_type;2

本词条内容贡献者为:

王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。