首页 > 编程语言 >C++11 mem_fn成员指针包装器

C++11 mem_fn成员指针包装器

时间:2024-06-30 23:22:27浏览次数:17  
标签:11 std mem auto 成员 C++ 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';
}

标签:11,std,mem,auto,成员,C++,fn,指针
From: https://www.cnblogs.com/3to4/p/18277150

相关文章

  • C++基础语法——《循环结构》题解
    循环结构参考资料:https://blog.csdn.net/m0_56945138/article/details/118929416需要掌握:1.for循环用法2.while循环用法3.continue跳过和break终止题号题目名称题解链接3067输出范围内的整数https://www.cnblogs.com/jyssh/p/182740551206简单的累加https://www......
  • 如何在Windows11下部署Linux子系统中安装GCC编译器
    GCC编译器安装:1:gcc出现命令找不到2.直接按照提示来安装。会发现链接找不到服务器原因是因为默认的服务器在国外,无法直接进行访问,需要切换成国内的服务器3.切换软件源——换成国内的服务器注意:软件源要与版本号一致!演示所用均为22.04版本号,可根据版本号找对应的软件......
  • 【C++】三只小猪称体重
    基于“黑马程序员”视频有关c++学习(p1-p27)完成本节案例学习入口:https://www.bilibili.com/video/BV1et411b73Z?p=28&vd_source=02cd0dc9bea072ad5e681a740632d7a0题目:有三只小猪称体重,分别输入三只小猪的体重,看一下谁最重?分析:先比较任意两只小猪(A)、(B)    如果A......
  • C++ : 如何用C语言实现C++的虚函数机制?
    前言在 googletest的源码中,看到gtest-matchers.h中实现的MatcherBase 类自定义了一个VTable,这种设计实现了一种类似于C++虚函数的机制。C++中的虚函数机制实质上就是通过这种方式实现的,本文用c语言自定义虚函数表VTable实现了一下virtual的功能,来深刻理解其机制。我们通过创......
  • C语言力扣刷题11——打家劫舍1——[线性动态规划]
    力扣刷题11——打家劫舍1和2——[线性动态规划]一、博客声明二、题目描述三、解题思路1、线性动态规划 a、什么是动态规划2、思路说明四、解题代码(附注释)一、博客声明  找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解题思路,开辟这个系列来记录......
  • c++高精度计算-大整数相乘
    例题-信奥赛1307:【例1.3】高精度乘法题目描述:输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。输入:输入两个高精度正整数M和N。输出:求这两个高精度数的积。输入样例:363输出样例:108 做题思路:学习乘法的朋友大概对加减法都有一定的了解,我就......
  • 信奥一本通1187:统计字符数
    1187:统计字符数时间限制:1000ms内存限制:65536KB提交数:31962通过数:18310【题目描述】给定一个由a-z这26个字符组成的字符串,统计其中哪个字符出现的次数最多。【输入】输入包含一行,一个字符串,长度不超过1000。【输出】输出一行,包括出现次数最多的字符......
  • Memcached数据洞察:解锁交互式数据可视化的大门
    ......
  • AI数据分析011:Excel表格智能判断数据起点来计算增长率
    文章目录一、介绍二、输入内容三、输出内容一、介绍计算Excel表格中2023年1月到2024年4月的总增长率和复合增长率。如果数据都有的情况下,公式很简单:总增长率=(O2-B2)/B2复合增长率=POWER((O2/B2),1/13)-1但是,2023年1月、2月、3月的数据,有些有,有些没有,是0......
  • 【保姆级教程+配置源码】在VScode配置C/C++环境
    目录一、下载VScode1.在官网直接下载安装即可2.安装中文插件二、下载C语言编译器MinGW-W64三、配置编译器环境变量1.解压下载的压缩包,复制该文件夹下bin目录所在地址2.在电脑搜索环境变量并打开3.点击环境变量→选择系统变量里的Path→点击编辑按钮4.点击新建5......