在js中的回调函数已经是随处可见了,像下面这样
// js callback demo
function foo(value){
console.log(value)
}
function inject(callback){
var value = 'hello!'
callback(value)
}
// main
function main(){
// 1.
inject(foo)
// 2.
inject(value => console.log(value))
}
main()
1和2这两种方式效果是一样的。
很容易发现,关键点在用函数做参数传递。
那么c++中怎么安全的使用。。
c++11引入了std::function,即函数类型。
函数做另一个函数的参数,那另一个函数的形参类型就可以这样定义
typedef function<void(int)> Callback;
定义了一个Callback类型,返回值void,形参int。
然后就可以用它定义接受函数参数的函数了
typedef function<void(int)> Callback;
void inject(Callback func){
func(233);
}
然后给他传一个函数foo
#include <iostream>
#include<functional>
using namespace std;
void foo(int value){
log(value);
}
typedef function<void(int)> Callback;
void inject(Callback func){
func(233);
}
int main()
{
// 1.
inject(foo);
return 0;
}
也可以使用闭包函数(lambda表达式)
int main()
{
// 1.
inject(foo);
// 2.
inject([](int value){
log(value);
});
return 0;
}
完整代码:
#include <iostream>
#include<functional>
using namespace std;
template<typename T>
void log(T value){
cout << value << endl;
}
void foo(int value){
log(value);
}
typedef function<void(int)> Callback;
void inject(Callback func){
func(233);
}
int main()
{
inject(foo);
inject([](int value){
log(value);
});
return 0;
}
定义function C++还有更简略的方法
#include <iostream>
#include<functional>
using namespace std;
template<typename T>
void log(T value){
cout << value << endl;
}
auto foo = []() -> string {
return "hehe";
};
int main()
{
log(foo());
return 0;
}
比如这个foo函数
看起来是不是很像某种语言?
(ts逃