函数模板
std::function<>是一种通用、多态的函数封装。
std::function<>可以存储和调用任何可调用的目标。
/* 函数指针方式 */
typedef void (*callbackFun)(int, int);
void fun(int num1, int num2){};
callbackFun f1 = fun;
f1(1, 2);
/* std::function<>方式 */
void fun(int num1, int num2){};
std::function<void(int, int)>f2 = fun;
f2(1,2);
void func(void)
{
std::cout<<__FUNCTION__<<endl;
}
std::function<void(void)> fp = func;
fp();//调用
class Obj
{
public:
static int func(int a, int b)
{
return a + b;
}
};
std::function<int(int, int)> fp = Obj::func;
fp(1, 2);
class Obj
{
public:
int func(int a)
{
cout<<a<<endl;
return 0;
}
};
/************************
第二种声明方法是采用类对象的引用
*************************/
std::function<int(Obj, int)> fp = &Obj::func;
std::function<int(Obj&, int)> fp = &Obj::func;
//要传入具体对象
Obj obj1;
fp(obj1, 2);
class Obj
{
public:
template <class T>
T func(T a, T b)
{
return (T)0;
}
};
/* 模板为int */
std::function<int(Obj&, int,int)> fp = &Obj::func<int>;
Obj obj1;
fp(obj1, 1, 2);
/* 模板为string */
std::function<string(Obj&, string, string)> fp = &Obj::func<string>;
Obj obj2;
fp(obj2, "a", "b");
class Obj
{
public:
int num;
Obj(int tNum):num(tNum){}
};
std::function<int(Obj&)> intp = &Obj::num;
Obj obj1(100);
cou<<intp(obj1)<<endl;//输出为100.
void call(string a, std::function<int(string)> fp)
{
fp(string)
}
int func(string &a)
{
cout<<a<<endl;
return 0;
}
call("hello", func)