std::mem_fn
< cpp | utility | functional
定义于头文件 <functional>
|
||
template< class M, class T > /*unspecified*/ mem_fn(M T::* pm) noexcept; |
(C++11 起) (C++20 前) |
|
template< class M, class T > constexpr /*unspecified*/ mem_fn(M T::* pm) noexcept; |
(C++20 起) | |
函数模板 std::mem_fn
生成指向成员指针的包装对象,它可以存储、复制及调用指向成员指针。到对象的引用和指针(含智能指针)可在调用 std::mem_fn
时使用。
参数
pm | - | 指向被包装成员的指针 |
返回值
std::mem_fn
返回未指定类型的调用包装,该类型拥有下列成员:
std::mem_fn 返回类型
成员类型
|
(C++20 前) |
成员函数
template<class... Args> /* see below */ operator()(Args&&... args) /* cvref-qualifiers */ |
(C++20 前) | |
template<class... Args> constexpr /* see below */ operator()(Args&&... args) /* cvref-qualifiers */ |
(C++20 起) | |
令 fn
为以指向成员的指针 pm
调用std::mem_fn
所返回的调用包装器。则表达式 fn(t, a2, ..., aN) 等价于 INVOKE(pm, t, a2, ..., aN) ,其中 INVOKE 是定义于可调用 (Callable) 的操作。
从而 operator()
的返回类型是std::result_of<decltype(pm)(Args&&...)>::type,或等价地为 std::invoke_result_t<decltype(pm), Args&&...> ,而 noexcept 说明符中的值等于 std::is_nothrow_invocable_v<decltype(pm), Args&&...>) (C++17 起)。
完美转发 args
中的每个参数,如同用 std::forward<Args>(args)... 。
示例
用 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
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2048 | C++11 | 提供了不需要的重载 | 已移除 |
LWG 2489 | C++11 | 未要求 noexcept | 已要求 |
参阅
(C++11) |
包装具有指定函数调用签名的任意类型的可调用对象 (类模板) |
(C++11) |
绑定一或多个实参到函数对象 (函数模板) |