【问题标题】:C++ using function as parameterC++ 使用函数作为参数
【发布时间】:2011-09-14 11:04:15
【问题描述】:

可能重复:
How do you pass a function as a parameter in C?

假设我有一个名为

的函数
void funct2(int a) {

}


void funct(int a, (void)(*funct2)(int a)) {

 ;


}

调用这个函数的正确方法是什么?我需要进行什么设置才能使其正常工作?

【问题讨论】:

  • 这个问题可能会有所帮助:stackoverflow.com/questions/9410/…
  • 你有两个函数,你调用哪一个有问题?请注意,您通过具有相同名称的指向函数参数的指针将函数 funct2 隐藏在 funct 中,因此您必须完全限定 funct2 才能直接从 funct 内部调用它。
  • 正确,因为众所周知,C++ 是 C。欢迎来到 CloseOverflow。如果有人使用 C++11,这里有很好的阅读:stackoverflow.com/questions/16111285/…——避免使用指针传递函数可以提高可读性。
  • 这与所引用的关于 C 的问题有何重复? C++ 有可能提供(或在某些时候提供)不同的方法。
  • @pooya13 这不是重复的。还有其他方法可以在 C++ 中将函数作为参数传递,而在 C 中是不可能的(例如,使用 functors)。

标签: c++


【解决方案1】:

通常,为了便于阅读,您使用 typedef 来定义自定义类型,如下所示:

typedef void (* vFunctionCall)(int args);

在定义这个 typedef 时,您希望返回您将指向的函数原型的参数类型,引导 typedef 标识符(在本例中为 void 类型)和 跟随它(在本例中为“int args”)。

当使用这个 typedef 作为另一个函数的参数时,你会像这样定义你的函数(这个 typedef 几乎可以像任何其他对象类型一样使用):

void funct(int a, vFunctionCall funct2) { ... }

然后像普通函数一样使用,像这样:

funct2(a);

所以一个完整的代码示例应该是这样的:

typedef void (* vFunctionCall)(int args);

void funct(int a, vFunctionCall funct2)
{
   funct2(a);
}

void otherFunct(int a)
{
   printf("%i", a);
}

int main()
{
   funct(2, (vFunctionCall)otherFunct);
   return 0;
}

并且会打印出来:

2

【讨论】:

  • 从 C++11 开始,人们宁愿使用using vFunctionCall = void (*)(int args); 以获得更好的可读性。或者更好的是,使用std::function
  • 无需进行任何投射。
  • 从 C++11 开始我更希望看到 std::function
  • @GoswinvonBrederlow std::function<void(int)>void (*)(int args) 做了更多,因此平台更难优化
【解决方案2】:

另一种方法是使用函数库。

std::function<output (input)>

这里是一个例子,我们将在funct 中使用funct2

#include <iostream>
using namespace std;
#include <functional>

void displayMessage(int a) {
    cout << "Hello, your number is: " << a << endl;
}

void printNumber(int a, function<void (int)> func) {
    func(a);
}

int main() {
    printNumber(3, displayMessage);
    return 0;
}

输出:Hello, your number is: 3

【讨论】:

  • 为什么投反对票?代码有什么问题吗?工作示例对我有用:)
  • 也许你应该演示调用函数
  • 尽量不要使用using namespace std。这是不好的做法:stackoverflow.com/questions/1452721/…
【解决方案3】:

检查一下

typedef void (*funct2)(int a);

void f(int a)
{
    print("some ...\n");
}

void dummy(int a, funct2 a)
{
     a(1);
}

void someOtherMehtod
{
    callback a = f;
    dummy(a)
}

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 2011-09-27
    • 2014-10-24
    • 2012-06-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多