std::mem_fn

来自cppreference.com
< cpp‎ | utility‎ | functional
 
 
 
函数对象
函数包装
(C++11)
mem_fn
(C++11)
(C++17)
绑定
(C++11)
引用包装
(C++11)
(C++11)
运算符包装
取反器
(过时)
(过时)

(过时)
查找器
旧绑定器与适配器
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)

(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
(C++17 前)
 
定义于头文件 <functional>
template< class R, class T >
/*unspecified*/ mem_fn(R T::* pm);
(1) (C++11 起)
template< class R, class T, class... Args >

/*unspecified*/ mem_fn(R (T::* pm)(Args...));
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) volatile);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const volatile);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) volatile &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const volatile &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) &&);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const &&);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) volatile &&);
template< class R, class T, class... Args >

/*unspecified*/ mem_fn(R (T::* pm)(Args...) const volatile &&);
(2) (C++11 起)
(C++14 前)

函数模板 std::mem_fn 生成指向成员指针的包装对象,它可以存储、复制及调用指向成员指针。到对象的引用和指针(含智能指针)可在调用 std::mem_fn 时使用。

重载 (2) 曾于 C++11 引入,但因为缺陷 #2048 在 C++14 被移除。

目录

[编辑] 参数

pm - 指向被包装成员的指针

[编辑] 返回值

std::mem_fn 返回未指定类型的调用包装,该类型拥有下列成员:

std::mem_fn Return type

成员类型

类型 定义
result_type(C++17中过时) pm 为指向成员函数的指针,则为 pm 的返回类型,对指向成员对象的指针不定义
argument_type(C++17中过时) pm 是指向无参数成员函数的指针则为 T* ,可有 cv 限定
first_argument_type(C++17中过时) pm 是指向接收一个参数的成员函数的指针则为 T*
second_argument_type(C++17中过时) pm 是指向接收一个 T1 类型参数的成员函数的指针则为 T1

成员函数

template<class... Args>
/* see below */ operator()(Args&&... args);

fn 为以指向成员的指针 pm 调用std::mem_fn 所返回的调用包装器。则表达式 fn(t, a2, ..., aN) 等价于 INVOKE(pm, t, a2, ..., aN) ,其中 INVOKE 是定义于可调用Callable)的操作。(从而 operator() 的返回类型是std::result_of<decltype(pm)(Args&&...)>::type 。)。

args 中的每个参数被完美转发,如同用 std::forward<Args>(args)...

[编辑] 异常

(无)

(C++17 前)
noexcept 规定:  
noexcept
  
(C++17 起)

[编辑] 示例 1

mem_fn 存储执行成员函数和成员对象:

#include <functional>
#include <iostream>
 
struct Foo {
    void display_greeting() {
        std::cout << "Hello, world.\n";
    }
    void display_number(int i) {
        std::cout << "number: " << i << '\n';
    }
    int data = 7;
};
 
int main() {
    Foo f;
 
    auto greet = std::mem_fn(&Foo::display_greeting);
    greet(f);
 
    auto print_num = std::mem_fn(&Foo::display_number);
    print_num(f, 42);
 
    auto access_data = std::mem_fn(&Foo::data);
    std::cout << "data: " << access_data(f) << '\n';
}

输出:

Hello, world.
number: 42
data: 7

[编辑] 示例 2

演示 C++14 对 std::mem_fn 规定的变更的效果。

#include <iostream>
#include <functional>
 
struct X {
    int x;
 
    int&       easy()      {return x;}
    int&       get()       {return x;}
    const int& get() const {return x;}
};
 
 
int main(void)
{
    auto a = std::mem_fn        (&X::easy); // 完全无问题
//  auto b = std::mem_fn<int&  >(&X::get ); // C++14 中不再能用
    auto c = std::mem_fn<int&()>(&X::get ); // C++11 与 C++14 中可用
    auto d = [] (X& x) {return x.get();};   // 另一种重载函数的手段
 
    X x = {33};
    std::cout << "a() = " << a(x) << '\n';
    std::cout << "c() = " << c(x) << '\n';
    std::cout << "d() = " << d(x) << '\n';
}

输出:

a() = 33
c() = 33
d() = 33

[编辑] 参阅

(C++11)
包装带有指定的函数调用签名的任何类型的可调用对象
原文:
wraps callable object of any type with specified function call signature
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

(类模板) [编辑]
(C++11)
对函数对象绑定一个或多个参数
原文:
binds one or more arguments to a function object
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

(函数模板) [编辑]