C++std::function和std::bind()的概念

这篇具有很好参考价值的文章主要介绍了C++std::function和std::bind()的概念。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

std::function: 一个通用的函数封装器,它允许你存储和调用任何可以被调用的东西,例如函数、函数指针、函数对象、Lambda 表达式等。

std::bind: 用于创建函数对象。一个可调用对象的绑定版本,可以提前绑定某些参数,稍后调用时只需提供剩余的参数。
在某些情况下,你可以将它们结合使用,例如,如果你想创建一个可调用对象,该对象包含绑定的参数,然后将其存储在 std::function 中。这在某些情况下可以提高代码的可读性和灵活性。

示例:

#include <iostream>
#include <functional>

int add(int a, int b) {
    return a + b;
}

int main() {
    // 创建一个绑定了参数的可调用对象,绑定参数为2,
    // 占位符_1表示稍后调用时传入的第1个参数放在_1这个位置
    std::function<int(int)> func = std::bind(add, 2, std::placeholders::_1);

    // 调用 std::function
    int result = func(3); // 这里相当于调用 add(2, 3)

    std::cout << "Result: " << result << std::endl;

    return 0;
}

std::functionstd::bind一起使用可以提供一些好处,尤其在以下情况下:

  • 延迟参数绑定:你可以使用std::bind在创建std::function对象时部分绑定参数,然后稍后再提供其余的参数。这使得你可以在调用可调用对象时动态地确定一些参数值。

  • 增强可读性:std::bind允许你清晰地指定参数的绑定方式,这可以提高代码的可读性,特别是当你处理复杂的函数签名时。

  • 灵活性:结合使用std::function和std::bind可以让你更容易地操作和传递可调用对象。这对于实现通用接口或处理回调函数时特别有用。

  • 减少代码冗余:如果你需要多次调用具有相同部分绑定的可调用对象,结合使用std::function和std::bind可以减少重复的绑定代码。


在不需要提前绑定参数的情况下,可以不使用std::bind()。在C++11引入Lambda表达式后,使用更加灵活和方便。以下是一个示例,演示如何使用 std::function 类型变量存储一个普通函数Lambda表达式

Copy code
#include <iostream>
#include <functional>

// 普通函数
int add(int a, int b) {
    return a + b;
}

int main() {
    // 使用 std::function 存储普通函数
    std::function<int(int, int)> func1 = add;

    // 使用 Lambda 表达式
    std::function<int(int, int)> func2 = [](int a, int b) {
        return a + b;
    };

    int result1 = func1(2, 3); // 调用 add 函数
    int result2 = func2(4, 5); // 调用 Lambda 表达式

    std::cout << "Result 1: " << result1 << std::endl;
    std::cout << "Result 2: " << result2 << std::endl;

    return 0;
}


考虑这种情况:可调用对象是类的成员函数

  • 成员函数是跟具体的对象绑定的,它可以操作该对象中的其他成员变量或者调用其他成员函数。成员函数可以做到分辨哪个对象在调用我是因为有隐藏this指针指向当前调用该函数的对象。
  • 比如obj.funcAdd(1,2),效果实际上是Obj::funcAdd(&obj, 1, 2);
  • 因此如果可调用对象是普通成员函数,我们要绑定一个参数,即指向调用对象的指针。

因此,比较推荐std::function与std::bind()配合使用,或者用lambda表达式

  • 当在一个成员函数中创建函数指针指向另一个普通成员函数时,绑定参数为this

    #include <iostream>
    #include <functional>
    
    class MyClass {
    public:
        void func1(int value) {
            std::cout << "func1: " << value << std::endl;
        }
    
        void func2(int value) {
            std::cout << "func2: " << value << std::endl;
        }
    
        void doSome() {
            // 使用 std::bind 创建 std::function 对象,将其绑定到 func2
            std::function<void(MyClass*, int)> functionPtr = 
            	std::bind(&MyClass::func2, this, std::placeholders::_2);
            
            // 调用函数指针,传入对象实例指针和参数
            functionPtr(42);
        }
    };
    
    int main() {
        MyClass obj;
        obj.doSome();
    
        return 0;
    }
    

    当然也可以手动传入this
    比如:std::bind(&MyClass::func2, std::placeholders::_1, std::placeholders::_2);
    调用:functionPtr(this, 42);

  • 利用lambda表达式作为可调用对象(在成员函数内,创建lambda可直接捕获this指针)

    #include <iostream>
    #include <functional>
    
    class MyClass {
    public:
        void func1(int value) {
            std::cout << "func1: " << value << std::endl;
        }
    
        void func2(int value) {
            std::cout << "func2: " << value << std::endl;
        }
    
        void doSome() {
            // 使用 Lambda 表达式捕获 this 指针
            std::function<void(int)> functionPtr = [this](int value) {
                MemberFunction2(value);
            };
            
            // 调用函数指针,不需要传递 this 指针
            functionPtr(42);
        }
    };
    
    int main() {
        MyClass obj;
        obj.doSome();
    
        return 0;
    }
    
  • 还有一种简单的情况:如果是在想存储某个对象的某个成员函数的指针,则需要传入该对象的地址文章来源地址https://www.toymoban.com/news/detail-695698.html

    #include <iostream>
    #include <functional>
    
    class MyClass {
    public:
        void func(int value) {
            std::cout << "func: " << value << std::endl;
        }
    };
    
    int main() {
        MyClass obj;
        
        // 创建 std::function 对象,提前绑定&obj,如果不绑定则需要手动传入
        std::function<void(int)> funcPtr = 
        	std::bind(&MyClass::func, &obj, std::placeholders::_1);
        
        funcPtr(42);
        
        return 0;
    }
    

到了这里,关于C++std::function和std::bind()的概念的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++11 包装器function和bind

    在C++11中,可以使用 std::function 来创建函数包装器。 std::function 是一个通用的函数对象,可以存储、复制和调用各种可调用对象,包括函数指针、函数对象、Lambda表达式等。 function 包装器也叫作适配器。 function 本质是一个类模板,也是一个包装器。 上面 func 可能是什么呢?

    2024年02月10日
    浏览(29)
  • c++ | this指针 和bind、function

    个人理解: this 指针 可以简单理解为类 对象的 指针(也是隐藏指针),注意,类的成员(成员函数、成员变量)是通过类的对象进行调用的。如果把函数充当成员函数是错误的,粗鲁的解释,类的成员函数都有一个隐藏的指针(this指针),但是 c函数是没有指针的。 看看

    2024年02月13日
    浏览(35)
  • 使用std::function 来实现回调函数、委托的功能

    std::function 可以用来实现回调函数和委托的功能。下面是一个回调函数的示例: 在上述示例中,我们定义了回调函数 printText ,这个函数接受一个字符型指针参数,并打印出这个字符串。然后,我们定义了函数 processText ,该函数接受两个参数:文本和一个 std::function 类型的对

    2024年02月09日
    浏览(40)
  • 【JavaScript】手撕前端面试题:手写Object.create | 手写Function.call | 手写Function.bind

    🖥️ NodeJS专栏:Node.js从入门到精通 🖥️ 博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述) 🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结) 🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬 👉

    2024年02月21日
    浏览(67)
  • 10.9.2 std::function 代替函数指针 Page182~183

    std::function是一个模板类,基本可作为函数指针的代替品,具备更多功能,特别是与函数对象及bind配合使用。使用std::function时,需要添加头文件 #include functional 18行,定义了一个函数指针类型PFoo, 19行,声明一个函数指针pfoo,并将foo赋给pfoo 37行,定义了一个function类型,该类

    2024年01月20日
    浏览(33)
  • iOS报错命名空间“std”中的“unary_function”

    刚刚将我的 Xcode 升级到 15.0,突然它开始在 RCT_Folly 中出现以下错误 我尝试删除缓存数据和派生数据并清理构建。也尝试删除 pod 和 node_modules。但没有任何帮助。 于是我按照网上提供的方法解决了: 选择 Pods 构建设置 在“Apple Clang - 预处理”部分 在“宏”部分下 添加发布和

    2024年02月05日
    浏览(44)
  • [开发语言][c++]:左值、右值、左值引用、右值引用和std::move()

    写在前面: 如果你也被 左值、右值、左值引用、右值引用和std::move 搞得焦头烂额,相关概念和理解不够深入,或者认识模棱两可,那么这篇文章将非常的适合你,耐心阅读,相信一定会有所收获~~ 左值: 可以取地址、位于等号左边 – 表达式结束后依然存在的持久对象

    2024年02月02日
    浏览(60)
  • C++笔记之从使用函数指针和typedef到使用std::function和using

    参考笔记:C++笔记之从数组指针到函数数组指针(使用using name和std::function) code review!

    2024年02月15日
    浏览(39)
  • C语言之算法的概念

    一、算法的基本概念 1.算法是为解决某一特定类型的问题而制定的一个实现过程。 2.特性 (1)有穷性:一个算法必须在执行有穷步之后结束,且每一步都可在有穷内完成,不能无限地执行下去。 (2)确定性:算法的每一个步骤应当是确切定义的,对于每一个过程不能有二义

    2023年04月08日
    浏览(27)
  • 【C语言】数据结构的基本概念与评价算法的指标

    1.1 基本概念和术语 1.1.1 数据 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料 1.1.2 数据元素 数据元素是数据的基本单位,通常作为一个整体进行考虑和处理,一个数据元素

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包