gpt4 book ai didi

c++ - 如何在函数中传递函数?

转载 作者:太空狗 更新时间:2023-10-29 19:39:00 24 4
gpt4 key购买 nike

这是一个奇怪的标题。如果有人能澄清我到底在问什么,我将不胜感激,因为我自己也不太确定。

我正在观看关于编程范式的斯坦福视频(那位老师很棒),当他开始这样做时我正在看视频 5:

void *lSearch( void* key, void* base, int elemSize, int n, int (*cmpFn)(void*, void*))

自然地,我心想,“哎呀,我不知道你可以先声明一个函数,然后再定义它!”。所以我创建了自己的 C++ 测试版本。

int foo(int (*bar)(void*, void*));
int bar(void* a, void* b);

int main(int argc, char** argv)
{
int *func = 0;
foo(bar);

cin.get();
return 0;
}

int foo(int (*bar)(void*, void*))
{
int c(10), d(15);
int *a = &c;
int *b = &d;
bar(a, b);
return 0;
}

int bar(void* a, void* b)
{
cout << "Why hello there." << endl;
return 0;
}

关于代码的问题是:如果我将函数 int *bar 声明为 foo 的参数,但不是 int (*bar) 。为什么!?

此外,该视频让我感到困惑的是,他的 lSearch 定义

void* lSearch(/*params*/, int (*cmpFn)(void*, void*)) 定义中是调用cmpFn,但是调用lSearch函数时

lSearch( /*params*/, intCmp );

还调用定义的函数 int intCmp(void* elem1, void* elem2); 我不明白它是如何工作的。为什么在 lSearch 中,函数名为 cmpFn,但定义为 intCmp,其类型为 int,而不是 int* 并且仍然有效?为什么 lSearch 中的函数不必定义参数?

最佳答案

int (*cmpFn)(void*, void*) 是一个函数指针 -- 一个指向稍后可以调用的函数的指针。当您调用 iSearch 时,您向它传递一个函数,该函数接受两个 void* 并返回一个 int,并将其绑定(bind)到参数 cmpFn。然后 iSearch 可以执行类似 int x = cmpFn(voidPtr1, voidPtr2); 的操作来调用该函数,将它传递给 voidPtr1voidPtr2 作为参数并将返回值存储在 x

您可以通过声明一个函数指针并在同一个函数中使用它来尝试一个简单的示例:

int test1(int x) {return x;}
int test2(int x) {return x+1;}

int main(int argc, char** argv) {
int (*fn)(int); // Function pointer named 'fn' that can hold a function that takes one int argument and returns an int
int rtn;

fn = test1; // Assign the 'test1' function to 'fn'
rtn = fn(4); // Call 'fn' ('test1') with the argument 4; it returns 4 and stores it in 'rtn'

fn = test2; // Assign the 'test2' function to 'fn'
rtn = fn(4); // Call 'fn' ('test2') with the argument 4; it returns 5 and stores it in 'rtn'
}

如果声明 int *bar 会失败,因为它不是函数指针,它只是一个指向整数的指针。函数指针的语法是 rtn_type (*name)(param1_type, param2_type, ...)

关于c++ - 如何在函数中传递函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3017039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com