📜  从 CC++ 中的函数返回函数指针(1)

📅  最后修改于: 2023-12-03 15:06:30.574000             🧑  作者: Mango

从 C/C++ 中的函数返回函数指针

函数指针是指向函数的指针变量,它们的用途是可以将一个函数作为参数传递给另一个函数,或者将一个函数的指针返回给调用者。在 C/C++ 中,函数指针也是一个变量,因此可以将它们作为返回值。

返回一般函数指针

一个函数可以返回一个指向另一个函数的指针。以下是一个返回一般函数指针的示例代码:

#include <iostream>

void func1()
{
    std::cout << "Hello from func1!" << std::endl;
}

void func2()
{
    std::cout << "Hello from func2!" << std::endl;
}

typedef void (*FuncPtr)();

FuncPtr getFunction(bool b)
{
    if (b)
        return func1;
    else
        return func2;
}

int main()
{
    FuncPtr fp = getFunction(true);
    (*fp)(); // Hello from func1!

    fp = getFunction(false);
    (*fp)(); // Hello from func2!

    return 0;
}

在上述代码中,getFunction() 函数返回一个名为 FuncPtr 的类型别名,指向无参且返回值为 void 的函数。如果传入的 bool 参数为 true,则返回 func1 函数的指针,否则返回 func2 函数的指针。在 main() 函数中,我们可以用 fp 指针变量保存返回的函数指针,并通过 (*fp)() 来调用对应的函数。

返回成员函数指针

如果要返回一个成员函数的指针,则必须使用类指针或引用来调用该函数。以下是一个返回成员函数指针的示例代码:

#include <iostream>

class MyClass
{
public:
    void func1()
    {
        std::cout << "Hello from MyClass::func1!" << std::endl;
    }

    void func2()
    {
        std::cout << "Hello from MyClass::func2!" << std::endl;
    }

    typedef void (MyClass::*MemFuncPtr)();

    MemFuncPtr getFunction(bool b)
    {
        if (b)
            return &MyClass::func1;
        else
            return &MyClass::func2;
    }
};

int main()
{
    MyClass obj;
    MyClass::MemFuncPtr fp = obj.getFunction(true);

    (obj.*fp)(); // Hello from MyClass::func1!

    fp = obj.getFunction(false);

    (obj.*fp)(); // Hello from MyClass::func2!

    return 0;
}

在上述代码中,MyClass 类定义了两个成员函数 func1()func2(),并且定义了一个 MemFuncPtr 类型别名,指向成员函数指针。在 getFunction() 函数中,如果传入的 bool 参数为 true,则返回 func1 成员函数的指针,否则返回 func2 成员函数的指针。在 main() 函数中,我们首先创建一个 MyClass 对象 obj,然后通过 obj.getFunction(true) 得到指向 func1 成员函数的指针,并将其赋值给 fp 变量。最后,我们通过 (obj.*fp)() 的方式调用对应的成员函数。

总之,从 C/C++ 中的函数返回函数指针可以非常灵活的应用于各种场景,不过需要特别注意函数指针的使用和声明方式。