工作中,有时候,我们需要根据某个条件来返回一个函数来执行某个任务,那么这个时候可以想到使用函数指针,也可以返回一个function
函数指针的例子
经典的函数: void (*signal(int sig, void (*func)(int)))(int); http://www.cplusplus.com/reference/csignal/signal/?kw=signal
分析:signal是一个函数,它有2个参数,一个参数是int类型,另一个参数是void(*)(int)函数指针,同时它返回一个函数指针 void(*)(int),
我们使用typedef来拆分一下:
typedef void(*pReturnFunc)(int)
pReturnFunc signal(int sig, void (*func)(int));
函数指针:
普通的函数指针书写格式: return_type(*function_pointer_name)(parameter list);
int func(int a); function_pointer_name ptrfunc = func; ptrfunc(0);
类成员函数指针书写:return_type(class_name::*function_pointer_name)(parameter list);
function_pointer_name ptr= &CTest::test; CTest t; (t.*ptr)(0);
class CTest
{
public:
static int test1(int a) { return a; }
static int test2(int a) { return a+a; }
int test3(int a) { return a*a; }
int test4(int a) { return a*a; }
//表示CTest类声明了一个pFunc成员,该成员类型是一个函数指针类型,指向 float(*)(int)的函数
float (*pFunc)(int);
//表示CTest类声明了一个pFunc2成员,该成员类型是一个函数指针类型,指向 float(CTest::*)(int)的函数
float (CTest::*pFunc2)(int);
//表示声明了一个 getfunc成员函数,该函数有一个 const char* 参数,并返回一个 float(*)(int)类型的函数指针
float (*getfunc(const char*))(int);
//表示声明了一个 getfunc2成员函数,该函数有一个 const char* 参数,并返回一个 float(CTest::*)(int)类型的函数指针
float (CTest::*getfunc2(const char*))(int);
};
//CTest::getfunc是类函数实现的写法
float (* CTest::getfunc(const char*))(int)
{
return 对应的函数指针;
}
//CTest::getfunc2是类函数实现的写法,是一个整体,CTest::*是getfunc2该函数的返回值中的一部分。
float (CTest::* CTest::getfunc2(const char*))(int)
{
return 对应的类成员函数指针;
}
typedef int(CTest::*pFunc)(int);
pFunc getfunc(const char* pFuncName)
{
pFunc func = nullptr;
if (strcmp(pFuncName, "test1") == 0)
{
func = &CTest::test3;
}
else if (strcmp(pFuncName, "test2") == 0)
{
func = &CTest::test4;
}
return func;
}
int(*GetStaticFunction(const char* pFuncName))(int)
{
int(*pfunc)(int) = NULL;
if (strcmp(pFuncName, "test1") == 0)
{
pfunc= &CTest::test1;
}
else if (strcmp(pFuncName, "test2")==0)
{
pfunc = &CTest::test2;
}
return pfunc;
}
int(CTest::*GetClassFunction(const char* pFuncName))(int)
{
if (strcmp(pFuncName, "test3") == 0)
{
return &CTest::test3;
}
else if (strcmp(pFuncName, "test4") == 0)
{
return &CTest::test4;
}
return NULL;
}
void main()
{
auto p = getfunc("test1");
p(0);
GetStaticFunction("test1")(1);
int(CTest::*pFunc)(int) = GetClassFunction("test3");
CTest t;
(t.*pFunc)(3);
return;
}
如果采用function的方式,更加方便
#include <functional>
std::function<int(int)> getFuncByname(const char* pFuncName)
{
if (strcmp(pFuncName, "test1") == 0)
{
return std::bind(&CTest::test1,std::placeholders::_1);
}
else if (strcmp(pFuncName, "test2") == 0)
{
return std::bind(&CTest::test2, std::placeholders::_1);
}
return nullptr;
}