C++11 mem_fn成员指针包装器
C++11 mem_fn成员指针包装器
介绍
函数模板 std::mem_fn
生成成员指针的包装器对象,用于存储、复制及调用成员指针。指向对象的引用和指针(包括智能指针)都可以在调用 std::mem_fn
时使用。
注意:
std::mem_fn
只能包装public
的成员指针,不能包装全局函数- 这里的成员指针指的是成员函数和成员变量
std::mem_fn
不是bind,无法绑定位置参数。它只是返回一个包装后的函数对象,从而通过这个函数对象传入对象本身就可以使用被包装的成员指针。
使用
使用场景较少,但是遇到了还是要知道含义:可以直接使用其他类公共函数,不需要自行编写。一般情况下不考虑适用,触发对代码逻辑和整洁性有好处的,可以适当使用。
#include <functional> #include <iostream> #include <memory> struct Foo { void display_greeting() { std::cout << "你好。\n"; } void display_number(int i) { std::cout << "数字:" << i << '\n'; } int add_xy(int x, int y) { return data + x + y; } template<typename... Args> int add_many(Args... args) { return data + (args + ...); } auto add_them(auto... args) // 需要 C++20 { return data + (args + ...); } int data = 7; }; int main() { auto f = Foo{}; // 包裹成员函数 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'; // 包裹成员函数 auto add_xy = std::mem_fn(&Foo::add_xy); std::cout << "add_xy:" << add_xy(f, 1, 2) << '\n'; // 用于智能指针 auto u = std::make_unique<Foo>(); std::cout << "access_data(u):" << access_data(u) << '\n'; std::cout << "add_xy(u, 1, 2):" << add_xy(u, 1, 2) << '\n'; // 用于带形参包的成员函数模板 auto add_many = std::mem_fn(&Foo::add_many<short, int, long>); std::cout << "add_many(u, ...):" << add_many(u, 1, 2, 3) << '\n'; auto add_them = std::mem_fn(&Foo::add_them<short, int, float, double>); std::cout << "add_them(u, ...):" << add_them(u, 5, 7, 10.0f, 13.0) << '\n'; }
本文作者:3的4次方
本文链接:https://www.cnblogs.com/3to4/p/18277150
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步