任何定义了函数调用操作符的对象都是函数对象。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