首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::mem_fn

Defined in header <functional>

template< class R, class T > /*unspecified*/ mem_fn(R T::* pm);

(1)

(since 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)

(since C++11) (until C++14)

功能模板std::mem_fn为指向成员的指针生成包装对象,这些指针可以存储、复制和调用指向成员的指针。引用和指针%28(包括对对象的智能指针%29)都可以在调用std::mem_fn...

过载%282%29是在C++11中引入的,而在C++14中作为缺陷#2048...

参数

pm

-

pointer to member that will be wrapped

返回值

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

STD:MEM[医]FN返回类型

成员类型

type

definition

result_type(deprecated in C++17)

the return type of pm if pm is a pointer to member function, not defined for pointer to member object

argument_type(deprecated in C++17)

T*, possibly cv-qualified, if pm is a pointer to member function taking no arguments

first_argument_type(deprecated in C++17)

T* if pm is a pointer to member function taking one argument

second_argument_type(deprecated in C++17)

T1 if pm is a pointer to member function taking one argument of type T1

成员函数

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

fn的调用返回的调用包装器。std::mem_fn具有指向成员的指针pm.然后表达fn(t, a2, ..., aN)等于INVOKE(pm, t, a2, ..., aN),在哪里调用中定义的操作吗?Callable.%28 Thus,返回类型为operator()std::result_of<decltype(pm)(Args&&...)>::type.%29

每一个论点args被完美地转发,就好像是...std::forward<Args>(args)......

例外

(none).

(until C++17)

noexcept specification: noexcept

(since C++17)

例1

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

二次

代码语言:javascript
复制
#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';
}

二次

产出:

二次

代码语言:javascript
复制
Hello, world.
number: 42
data: 7

二次

例2

演示C++14对STD::MEM规范的影响[医]FN。

二次

代码语言:javascript
复制
#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); // no problem at all
//  auto b = std::mem_fn<int&  >(&X::get ); // no longer works in C++14
    auto c = std::mem_fn<int&()>(&X::get ); // works with both C++11 and C++14
    auto d = [] (X& x) {return x.get();};   // another approach to overload resolution
 
    X x = {33};
    std::cout << "a() = " << a(x) << '\n';
    std::cout << "c() = " << c(x) << '\n';
    std::cout << "d() = " << d(x) << '\n';
}

二次

产出:

二次

代码语言:javascript
复制
a() = 33
c() = 33
d() = 33

二次

另见

function (C++11)

wraps callable object of any type with specified function call signature (class template)

bind (C++11)

binds one or more arguments to a function object (function template)

代码语言:txt
复制
 © cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券