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,
- 类似于视频解码回调上来解码后的数据,
- socket中的接收端数据回调上来
- 底层的信号,回调到应用层,类似于usb插拔,将插拔信息通过C++回调到上层
参考文献
- nodejs node-addon-examples