如何编写函数指针比调用它们更好?

时间:2016-10-06 16:24:47

标签: c++ c function-pointers

我很高兴最近使用函数指针。我知道它们是如何工作的。函数指针的经典示例是:

int add() {
  return (100+10);
}
int sub() {
  return (100-10);
}

void print(int x, int y, int (*func)()) {
  printf("value is : %d", (x+y+(*func)()));
}

int main() {
  int x=100, y=200;
  print(x,y,add);
  print(x,y,sub);
}

有一天有人问我,这比调用(在主要内部)更好:

print(add(x,y));
print(sub(x,y));

我努力解释这一点。它只是关于堆栈还是下面还有其他东西?

4 个答案:

答案 0 :(得分:6)

我真的不明白为什么你展示的代码会成为函数指针的经典例子。函数指针'从这样的代码中可以看出实用程序更加明显:

template <typename ... Ts>
Vector(Ts&&... args) : data{{std::forward<Ts>(args)...}}
{}

基本上,如果您接受指向函数作为参数的指针,它允许您对 选择的数据应用客户端提供的操作。

答案 1 :(得分:2)

经典用例(概括)是qsort(https://linux.die.net/man/3/qsort)。排序算法是通用的,但实现不知道如何比较项目,因为它们可以是任何类型。所以你传入一个它可以调用的函数来比较两个元素。

答案 2 :(得分:1)

如果您硬编码调用一个或另一个函数指针,那么函数指针几乎是无用的开销,就像您的示例一样。它们的强大之处在于能够动态地选择和使用它们,或者将它们传递给其他功能:

你可以把函数指针放在一个数组中,然后遍历它们;或者您可以根据用户输入或输入文件内容或其他情况调用选定的。在这两种情况下,它们都允许编写具有单个动态调用的代码,而不是潜在的长开关或if语句链。

第二个 - 甚至更有用 - 的概念是将它们传递给其他一些功能(有时也称为回调&#39;);一个典型的例子是使用数据表和函数指针形式的自定义比较函数调用qsort。然后qsort将在标准化排序算法中使用您的比较函数;没有其他方法可以实现这一点。

答案 3 :(得分:0)

&#34;指向功能&#34;是一个对象。因此,它可以像任何其他对象一样被复制,存储,分配。 其中对函数(正常函数)的引用不是对象。

我认为经典的例子是......用户通过使用回调函数来处理事件处理,这已成为任何UI软件的明显模式。