任何定义了函数调用操作符的对象都是函数对象。C++ 支持创建、操作新的函数对象,同时也提供了许多内置的函数对象。
函数包装器
std::function 提供存储任意类型函数对象的支持。
从成员指针创建出函数对象
std::mem_fn
| template< class M, class T > | (C++11 起) (C++17 前) | |
| template< class M, class T > | (C++17 起) | 
函数模板 
参数
| pm | - | 指向被包装成员的指针 | 
返回值
std::mem_fn 返回类型
| 成员类型
 | (C++20 前) | 
成员函数
| template<class... Args> | 
令 
完美转发 
调用示例
#include <functional>
#include <iostream>
struct Foo
{
    void display_greeting()
    {
        std::cout << "Hello, world." << " " << __FUNCTION__ << " " << std::endl;
    }
    void display_number(int i)
    {
        std::cout << "number: " << i << " " << __FUNCTION__ << " " << std::endl;
    }
    int data = 7;
};
int main()
{
    Foo f;
    auto greet = std::mem_fn(&Foo::display_greeting);
    greet(&f);
    std::cout << "typeid(greet).name() " << typeid(greet).name() << std::endl;
    std::cout << "typeid(greet).name() " << typeid(greet).name() << std::endl;
    auto print_num = std::mem_fn(&Foo::display_number);
    print_num(&f, 42);
    std::cout << "typeid(print_num).name() " << typeid(print_num).name() << std::endl;
    auto access_data = std::mem_fn(&Foo::data);
    std::cout << "data: " << access_data(&f) << std::endl;
    std::cout << "typeid(access_data).name() " << typeid(access_data).name() << std::endl;
    return 0;
}
输出
Hello, world. display_greeting typeid(greet).name() St7_Mem_fnIM3FooFvvEE typeid(greet).name() St7_Mem_fnIM3FooFvvEE number: 42 display_number typeid(print_num).name() St7_Mem_fnIM3FooFviEE data: 7 typeid(access_data).name() St7_Mem_fnIM3FooiE