c++中返回函数指针的函数

本文探讨了C++中函数指针的使用实例,如signal函数及类成员函数指针,并与lambda表达式进行比较,展示了如何通过两者实现动态函数调用。同时介绍了std::function的使用,以简化函数指针操作。
摘要由CSDN通过智能技术生成

工作中,有时候,我们需要根据某个条件来返回一个函数来执行某个任务,那么这个时候可以想到使用函数指针,也可以返回一个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;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值