函式模板
<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


異常安全

無異常保證: 絕不丟擲異常。

另見