如何在C++中将函数作为参数传递给另一个函数?[副本]

tkclm6bt  于 2023-05-02  发布在  其他
关注(0)|答案(3)|浏览(147)

此问题已在此处有答案

C++ using function as parameter(4个答案)
How to pass a function as parameter in C++(2个答案)
昨天关门了。
我需要传递一个没有参数的函数给另一个函数,我该怎么做?
我在谷歌上搜索了一下,发现我需要从functional使用std::function,但不知道如何传递没有参数的函数。

2fjabf4q

2fjabf4q1#

使用std::function,您可以像下面的示例那样实现:c++ shell

#include <iostream>
#include <functional>

void myFunction() {
  std::cout << "Hello world!\n";
}

void foo(std::function<void()> f) {
  f();
}

int main() {
  foo(myFunction); // Pass the function without arguments
  return 0;
}
5vf7fwbs

5vf7fwbs2#

这取决于你要调用的函数类型。不能传递属于类的函数,至少不能直接传递。如果你想传递一个普通的函数,你可以把函数作为一个指针(它的内存地址)传递。对于类函数,你可以使用lambda来做类似的事情。

void TheCallback() {
    printf("The Callback has been called!");
}

using TheCallbackT = void(*)();
void DoTheFunction(int count, const TheCallbackT& func) {
    for (int i=0; i<count; i++) {
        func();
    }
}

// using templates
// you can use a lambda to call a class function here
template<typename Function>
void DoTheFunctionT(int count, const Function& func) {
    for(int i=0; i<count; i++) {
        func();
    }
}

// C compatible
void DoTheFunctionC(int count, void(*func)(void*), void* _this) {
    for(int i=0; i<count; i++) {
        func(_this);
    }
}

// for a struct/class function with no params
// it looks like no parameters, but the struct pointer itself may be the first/only param
// it may be pushed onto the stack
struct TheStruct {
    int a,b,c;

    int GetTotal() {
        return a+b+c;
    }
};

void PrintStructTotal(void* ctx) {
    TheStruct* pTheStruct = (TheStruct*)ctx;
    printf("TheTotalC: %i\n", pTheStruct->GetTotal());
}

int main() {
    TheStruct powerfulobj;
    powerfulobj.a=2;
    powerfulobj.b=3;
    powerfulobj.c=6;

    // for normal function
    DoTheFunction(10, TheCallback);

    // for class function
    DoTheFunctionT(10, [&](){ printf("TheTotalT: %i\n", powerfulobj.GetTotal()); });
    
    // C
    DoTheFunctionC(12, PrintStructTotal, &powerfulobj);

    // mixed
    DoTheFunctionC(12, 
        [](void* ptr) { 
            printf("TheTotalCM: %i\n", ((TheStruct*)ptr)->GetTotal()); 
        },
        &powerfulobj
    );

    return 0;
}
ql3eal8s

ql3eal8s3#

如果你不想使用std::functional,你可以使用函数指针,这在C中也是有效的。
你可以有这样的东西:

#include <stdio.h>

void sayHello() {
    printf("Hello World\n");
}

void loop(unsigned int count, void(*func)()) {
    for (unsigned int i = 0; i < count; i++)
        func();
}

void main()
{
    loop(2, sayHello);
}

在函数loop()中,第二个参数是函数指针。它的类型与你想要调用的函数的返回类型相同,在括号中你可以写上你要调用的函数有参数的任何类型。因此,如果我的函数sayHello()实际上是int sayHello(double value),则必须像这样指定loop()函数:

void loop(unsigned int count, int (*func)(double);

你可以用e来调用sayHello()函数。例如func(3.14);。您可以像往常一样使用sayHello()的返回值。

相关问题