跳转到内容

C++/Functional

本页使用了标题或全文手工转换
维基教科书,自由的教学读本
< C++

Template:C++ Standard library <functional>C++标准程式库中的一个头文件,定义了C++标准中的多个用于表示函数对象(function object)的类模板(class template),包括算术操作、比较操作、逻辑操作;以及用于绑定函数对象的实参值的绑定器(binder)。这些类模板的实例是具有函数调用运算符(function call operator)的C++的类,这些类的实例可以如同函数一样调用。[1]不必写新的函数对象,而仅是组合预定义的函数对象与函数对象适配器(function object adaptor),就可以执行非常复杂的操作。

C++11标准提供了类模板std::function是一个通用的、多态的函数包装器(function wrapper)。std::function的实例可以存储、复制、调用任何可调用目标—如函数、lambda表达式、bind表达式(函数适配器对象实例,通过设定参数值把函数变换到参数更少的其他函数)、其他函数对象。

相关概念

[编辑]

函数对象,是可以具有如同普通函数一样的函数调用语法的数据对象。包括函数指针、类成员函数指针、或者内部定义了函数调用运算符的类对象等。

C++的TR1标准引入了'调用特征'(call signature):函数返回类型,之后是用括号包起来的用逗号分隔的形参类型列表(可以为0个形参)。调用特征广泛用于STL的模板定义。 调用特征定义了一个函数的类型,但与传统的函数指针类型的定义不同,调用特征不需要表示“指针”型的星号*

可调用类型(callable type),包括函数指针、类成员函数指针、 类数据成员指针(因为类的数据成员可能是个可调用类型)、或者内部定义了函数调用运算符的类类型。

C++标准库提供的C++算法,并不需要超过两个参数的函数对象。返回布尔型的函数是非常重要的特例,单参函数且返回值为布尔型,称为谓词。双参函数返回布尔型,称为二元谓词(binary predicate)。

可适配的函数对象

[编辑]

C++标准规定,可适配的函数对象(adaptable function object)必须用typedef来指出其参数类型与返回值类型。对于无参函数对象F0,必须定义类型F0::result_type。对于单参函数对象F1,必须定义类型F1::argument_type与F1::result_type。对于双参函数对象F2,必须定义F2::first_argument_type、F2::second_argument_type、F2::result_type。C++标准库提供了作为基类型unary_function与binary_function来简化可适配的无参函数与单参函数。可以从这两个类派生自己的类。

类模板

[编辑]
  • bad_function_call 这是一个被抛出的异常类,用于表示被调用的函数对象为空。例如,定义了一个std::function对象,但尚未用函数指针或函数对象来初始化,就调用了这个std::function对象,这时抛出该异常类。
  • binary_negate 这是一个类模板用于包装函数对象。初始化时在内部存储了一个双参函数对象。调用时把指定的双参函数对象的返回值取反。
  • binder1st 类模板用于包装函数对象。初始化时在内部存储了一个双参函数对象,并把该双参函数的第一个参数绑定为一个固定的值,当作单参函数来调用。
  • binder2nd 类模板用于包装函数对象。初始化时在内部存储了一个双参函数对象,并把该双参函数的第二个参数绑定为一个固定的值,当作单参函数来调用。
  • const_mem_fun_ref_t 类模板作为适配器,初始化时在内部存储一个无参的const型类成员函数指针。调用时当作单参函数(传入的参数实际上是类成员函数所需的该类实例的引用)。
  • const_mem_fun_t 类模板作为适配器,初始化时在内部存储一个无参的const型类成员函数指针。调用时当作单参函数(传入的参数实际上是类成员函数所需的该类实例的指针)。
  • const_mem_fun1_ref_t 类模板作为适配器,初始化时在内部存储一个单参的const型类成员函数指针。调用时当作双参函数(传入的第一个参数实际上是类成员函数所需的该类实例的引用)。
  • const_mem_fun1_t 类模板作为适配器,初始化时在内部存储一个单参的const型类成员函数指针。调用时当作双参函数(传入的第一个参数实际上是类成员函数所需的该类实例的指针)。
  • function 类模板,用于包装一个可调用(callable)的类。可以看做是C++98标准库中函数对象mem_fun_t, pointer_to_unary_function等的替代品。function的模板参数是包装的函数对象的call signature。可以直接包装类成员函数(在调用时必须把类实例作为第一个参数)
  • hash 模板类,其内部的函数成员运算符函数输入为一个标量或字符串,输出为计算出来的hash值。用于STL的unordered_map, unordered_multimap, unordered_set, and unordered_multiset等模板类。
  • is_bind_expression 类模板,用于判断指定表达式是否为std::bind函数返回的结果类型。
  • is_placeholder 类模板,用于判断指定表达式是否为std::placeholders中定义的placeholder类型.
  • mem_fun_ref_t 类模板作为适配器,初始化时在内部存储一个无参的non_const型类成员函数指针。调用时当作单参函数(传入的参数实际上是类成员函数所需的该类实例的引用)。
  • mem_fun_t 类模板作为适配器,初始化时在内部存储一个无参的non_const型类成员函数指针。调用时当作单参函数(传入的参数实际上是类成员函数所需的该类实例的指针)。
  • mem_fun1_ref_t 类模板作为适配器,初始化时在内部存储一个单参的non_const型类成员函数指针。调用时当作双参函数(传入的第一个参数实际上是类成员函数所需的该类实例的引用)。
  • mem_fun1_t 类模板作为适配器,初始化时在内部存储一个单参的non_const型类成员函数指针。调用时当作双参函数(传入的第一个参数实际上是类成员函数所需的该类实例的指针)。
  • pointer_to_binary_function 类模板,用于把一个双参的函数对象转变为可适配的双参函数对象。即在内部定义 first_argument_type, second_argument_type, result_type三个类型。这样才能进一步绑定参数等操作。
  • pointer_to_unary_function 类模板,用于把一个单参的函数对象转变为可适配的单参函数对象。即在内部定义 argument_type, result_type两个类型。这样才能进一步绑定参数等操作。
  • reference_wrapper 类模板,用于包装对一个实例的引用。如果被包装的类型是单参函数对象或者双参函数对象,则会特化处理。
  • result_of 类模板,用于取出一个可调用函数对象的结果类型
  • unary_negate 类模板,用于把指定的单参谓词的结果取反。

函数

[编辑]
  • bind 把一个多参数函数对象转化为可适配的函数对象,绑定任意的参数为确定的值,重新安排参数对应顺序。
  • bind1st C++98用于绑定双参函数的第一个参数为确定的值
  • bind2nd C++98用于绑定双参函数的第二个参数为确定的值
  • bit_and 返回一个bit_and结构,作为函数对象
  • bit_or 返回一个bit_or结构,作为函数对象
  • bit_xor 返回一个bit_xor结构,作为函数对象
  • cref 把一个实例对象包装为reference_wrapper模板类
  • mem_fn 返回一个类成员函数的包装可调用类。调用时显式传递一个类对象实例作为第一个参数。
  • mem_fun 返回一个类成员函数的包装类对象mem_fun_t、mem_fun1_t等。用类对象的指针去调用包装类对象。
  • mem_fun_ref 返回一个类成员函数的包装类对象mem_fun_ref_t、mem_fun1_ref_t等。用类对象的引用去调用包装类对象。
  • not1 返回一个对谓词的结果取反的函数对象包装类
  • not2 返回一个对二元谓词的结果取反的函数对象包装类
  • ptr_fun 对函数对象,做可适配改造,返回pointer_to_binary_function或者pointer_to_unary_function类对象
  • ref 对一个实例对象,返回一个reference_wrapper包装类。以此作为函数对象的参数绑定,还可以修改原实例的值来改变绑定的参数值。
  • swap 交换两个function的值。

结构

[编辑]

C++标准头文件functional中预定义了多个函数对象,包括算术运算的plus、minus、multiplies、divides、modulus、negate;比较运算equal_to、not_equal_to、greater、less、greater_equal、less_equal;逻辑运算logical_and、logical_or、logical_not。[1]

  • binary_function 一个空基类,用于派生其他的双参函数对象的结构
  • divides 做算术除法的函数对象的结构
  • equal_to 做相等比较的二元谓词的函数对象的结构
  • greater 做大于比较的的二元谓词的函数对象的结构
  • greater_equal 做大于比较等于的的二元谓词的函数对象的结构
  • less 做小于比较的的二元谓词的函数对象的结构
  • less_equal 做小于比较等于的的二元谓词的函数对象的结构
  • logical_and 做逻辑与的的二元谓词的函数对象的结构
  • logical_not 做逻辑非的的谓词的函数对象的结构
  • logical_or 做逻辑或的的二元谓词的函数对象的结构
  • minus 做算术减法的函数对象的结构
  • modulus 做算术模运算的函数对象的结构
  • multiplies 做算术乘法的函数对象的结构
  • negate 做算术相反数运算的函数对象的结构
  • not_equal_to 做不等比较的二元谓词的函数对象的结构
  • plus 做算术加法的函数对象的结构
  • unary_function 一个空基类,用于派生其他的单参函数对象的结构

对象

[编辑]
  • _1 到 _M 用于指示bind函数的形参对应于被包装函数的那个实参。

运算符

[编辑]
  • operator== 比较函数对象是否为空指针
  • operator!= 比较函数对象是否不为空指针

参考文献

[编辑]

页面Template:ReflistH/styles.css没有内容。

  1. 1.0 1.1 Josuttis, Nicolai M. The C++ Standard Library. Addison-Wesley. 1999. ISBN 0-201-37926-0.