如何将引用函数传递给另一个函数
Posted
技术标签:
【中文标题】如何将引用函数传递给另一个函数【英文标题】:How to pass reference-to-function into another function 【发布时间】:2011-10-31 20:31:51 【问题描述】:我一直在阅读有关函数指针以及将它们用作其他函数的参数的内容。
我的问题是如何在不使用指针的情况下通过引用传递函数?我一直在网上寻找答案,但没有找到好的答案。
我知道您可以像这样通过引用传递变量:void funct(int& anInt);
。如果参数不是对变量的引用,而是对函数的引用,你会如何做类似的事情?
另外,你将如何在函数体中使用对函数的引用?
【问题讨论】:
注意:不能传递函数。您只能将引用或指针传递给函数。 【参考方案1】:#include <iostream>
using namespace std;
void doCall( void (&f)(int) )
f( 42 );
void foo( int x )
cout << "The answer might be " << x << "." << endl;
int main()
doCall( foo );
【讨论】:
出于好奇,我为什么要使用对函数的引用而不是指向函数的指针? @FredOverflow:因为指针可以为空或无效。引用保证它有效且不为空(没有空引用),否则程序中存在错误。 @Alf P. Steinbach:“否则程序中存在错误”理论上听起来不错,但如果您有类似sometype &ref = *ptr;
的内容,则指针中的地址将被简单地复制到引用中的地址,可能无效或为空。当ptr
无效或为空时,您可能会说上面的语句是未定义的行为,但是在编译或运行时不会有任何迹象,因此仍然由程序员来确保它是有效且非空的,就像您使用指针一样。所以我说程序员没有任何区别。
我认为有很大的不同。如果您在每个 API 中使用 null 不是合理值的引用来构建整个代码库,那么sometype &ref = *ptr;
的情况就不会经常出现,因为您到处都有引用。在 API 中接受引用和指针之间也存在语义差异。接受引用清楚地表明该函数不能用 null 调用。如果是引用,那就是调用者的责任,如果是指针,那就是被调用者的责任。以上是关于如何将引用函数传递给另一个函数的主要内容,如果未能解决你的问题,请参考以下文章