std::function介绍与使用

std::function介绍


std::function是C++标准库中的一个函数对象,类似于一个可重用的函数指针。它允许我们以一种更加灵活的方式调用函数,而不必了解其具体实现。使用std::function可以让我们将函数作为参数传递、在函数内部调用以及在模板中使用函数。

std::function由一个函数指针和一个函数对象组成。函数指针指向一个具体的函数,而函数对象则包含了指向该函数的指针。

std::function可以用于许多场景,其中最常见的是使用std::function来编写可重用的函数。std::function可以存储函数的返回值、输入参数和输出参数,并且可以在函数内部进行调用,而不必了解其具体实现。

std::function还可以用于在模板中使用函数。使用std::function可以在模板中使用函数作为参数传递,并在函数内部调用。

std::function是C++标准库中的一个重要组成部分,可以大大简化编程,提高代码的重用性和可维护性。

如何使用

#include <iostream>
#include <memory>
#include <functional> // for std::function and std::bind

class Sprite{
    public:
        Sprite() = default;
        typedef std::function<int(int, int)> PlusFunction;


        void registerPlusSignal(const PlusFunction& callback){
            _callback = callback;
        }

        int plusSignal(int a, int b){
            return _callback(a,b);
        }

    private:
        PlusFunction _callback;
};

class Idle{
    public:
        Idle(){
            // _sprite = std::make_shared<Sprite>();
        }
        void registerCallback(const Sprite::PlusFunction& callback){
            if(_sprite.get() == nullptr){
                std::cout << " Must Set Sprite Before RegisterCallback" << std::endl;
                return;
            }
            _sprite->registerPlusSignal(callback);
        }


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

        void setSprite(std::shared_ptr<Sprite>& sprite){
            _sprite = sprite;
        }


        std::shared_ptr<Sprite> _sprite;
};

int main() {
    //function demo
    Idle idle;
    std::shared_ptr<Sprite> sprite = std::make_shared<Sprite>();
    idle.setSprite(sprite);
    idle.registerCallback(std::bind(&Idle::Plus, &idle, std::placeholders::_1, std::placeholders::_2));

    int a = 0, b = 0;
    while(a != 10000){
        std::cout << "please input two number" << std::endl;
        std::cin >> a >> b;
        std::cout << "the plus " << a << " + " << b <<  " result:" << sprite->plusSignal(a, b) << std::endl;
    }

    //other exp
    int x = 42;
    auto addOneFunc = [](auto& arg) -> decltype(arg + 1) { return arg + 1; };
    
    auto resultAddOne = std::bind(addOneFunc, std::forward<decltype(x)>(x));
    
    if (resultAddOne() == 43) {
        std::cout << "Success!" << resultAddOne() << std::endl;
    } else {
        std::cout << "Error, result was " << resultAddOne() << std::endl;
    }
}

输出结果

please input two number
100 9
the plus 100 + 9 result:109
please input two number
10000
90 
the plus 10000 + 90 result:10090
Success!43

结论

std::function就是C++版本函数指针,作用就是执行一些回调函数,返回底层的message,

  1. 类似于视频解码回调上来解码后的数据,
  2. socket中的接收端数据回调上来
  3. 底层的信号,回调到应用层,类似于usb插拔,将插拔信息通过C++回调到上层

参考文献

  1. nodejs node-addon-examples
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值