如何编写函数指针比调用它们更好
How writing function pointers are better than calling them functions?
我最近很喜欢使用函数指针。我得知道他们是怎么工作的。函数指针的经典例子是:
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);
}
前几天有人问我,如何比调用(inside main)更好:
print(add(x,y));
print(sub(x,y));
,我努力解释。只是因为这堆东西,还是因为下面还有别的东西?
我真的不明白为什么您展示的代码是函数指针的经典示例。函数指针的效用在如下代码中更加明显:
void transform(int *dst, const int *src, size_t len, int (*f)(int))
{
for (size_t i = 0; i < len; ++i)
dst[i] = f(src[i]);
}
基本上,如果你接受一个指向函数的指针作为参数,它允许你在选择的数据上应用客户机提供的操作。
经典用例(泛化)是qsort (https://linux.die.net/man/3/qsort)。排序算法是通用的,但实现不知道如何比较项,因为它们可以是任何类型。所以你传入一个函数,它可以调用它来比较两个元素。
函数指针是非常无用的开销,如果您硬编码调用其中一个,就像您的示例一样。它们的强大之处在于能够动态地选择和使用它们,或者将它们传递给其他函数:
你可以把函数指针放在数组中,然后遍历它们;也可以根据用户输入、输入文件内容或其他情况调用选定的。在这两种情况下,它们都允许编写具有单个动态调用的代码,而不是潜在的长switch或if语句链。
第二个更有用的概念是将它们传递给其他函数(有时也称为"回调");一个经典的例子是用你的数据表和一个自定义的比较函数以函数指针的形式调用qsort
。然后Qsort将在标准化排序算法中使用你的比较函数;没有其他方法可以实现这个
"指向函数的指针"是一个对象。所以它可以像其他对象一样被复制,存储,赋值。其中对函数(普通函数)的引用不是对象。
我认为最经典的例子是....用户界面使用回调函数处理事件,这已经成为任何UI软件的明显模式。
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 哪种方法更好,性能明智
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 在类的第一个/最后一个实例存在之前/之后调用一对函数.有没有更好的方法?
- 系统调用:一次和多次,哪个更好?
- 调用包含所有所需代码的函数或内部包含所需代码的其他函数的函数更好?
- 在调用vector::assign()之前调用vector::reserve()更好吗?
- 当我们不关心返回值时,在 c++ 的代码片段中只调用一次函数的更好方法?
- 模拟系统调用——有更好的方法吗
- CPP 建议更好的方法在没有开销/IO 调用的情况下进入静音状态
- 如何从调用原始函数的自定义函数中获取错误?你有更好的建议吗
- 通过hash_map<字符串 fnPtr>调用函数指针是否比C++中的多个 if/else if/else 语句更有效或更好?
- 如何编写函数指针比调用它们更好
- 在函数调用中处理多个布尔变量的更好方法
- 在std::vector对象(不是指针)上调用push_back会产生严重的副作用.所以指针会更好