函数模板
<functional>

std::mem_fn

template <class Ret, class T>  /* unspecified */ mem_fn (Ret T::* pm);
将成员函数转换为函数对象
返回一个函数对象,该对象的函数调用会调用 pm 所指向的成员函数。

返回对象的类型具有以下属性
  • 其函数调用将类型为 T 的对象(或指向它的引用或指针)作为第一个参数,并将 pm(如果有)所接受的参数作为附加参数。这种调用与 fn 作为第一个参数的效果与调用 fn.*pm(如果 fn 是指针,则为 (*fn).*pm)相同,并转发任何附加参数。
  • 它有一个名为 result_type 的成员,定义为 Ret(即 pm 的返回类型)的别名。
  • 如果 pm 所指向的成员不接受任何参数,它有一个名为 argument_type 的成员,定义为 T* 的别名。
  • 如果 pm 所指向的成员接受一个参数,它有一个名为 first_argument_type 的成员,定义为 T* 的别名,以及一个名为 second_argument_type 的成员,定义为 pm 所接受参数的别名。
  • 它是 无异常移动构造无异常拷贝构造无异常拷贝赋值

参数

pm
成员函数的指针。

返回值

一个函数对象,在被调用时,会在作为第一个参数传递的对象上调用 pm

返回类型未指定,但返回的类型是一个 函数对象类,具有上述属性。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// mem_fn example
#include <iostream>     // std::cout
#include <functional>   // std::mem_fn

struct int_holder {
  int value;
  int triple() {return value*3;}
};

int main () {
  int_holder five {5};

  // call member directly:
  std::cout << five.triple() << '\n';

  // same as above using a mem_fn:
  auto triple = std::mem_fn (&int_holder::triple);
  std::cout << triple(five) << '\n';

  return 0;
}

输出

15
15


异常安全

无异常保证: 绝不抛出异常。

另见