用我们的决心、信心和毅力来培植我们的生命|

3的4次方

园龄:2年1个月粉丝:5关注:89

2024-06-30 23:11阅读: 37评论: 0推荐: 0

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 中国大陆许可协议进行许可。

posted @   3的4次方  阅读(37)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起