通过引用传递函数指针

时间:2012-03-09 07:55:32

标签: c++

您好我正在尝试学习C / C ++中的一些函数指针,我试图在Ubuntu上用gcc编写以下C ++代码。

此代码应执行multiply或者add函数,具体取决于 编译期间提供的预处理程序标志-DADD或-DMULTIPLY

#include <iostream>
#include <iomanip>
//Adds two numbers
int add(int a, int b)
{
  return a+b;
}
//Multiplies two numbers
int multiply(int a, int b)
{
  return a*b;
}

//Function to set the correct function to be executed.
//All functions here should have the same signature.
void functionsetter( void (*ptr2fun)(int,int)  )
{
#ifdef ADD
  ptr2fun   = add;
#endif

#ifdef MULTIPLY 
   ptr2fun  = multiply
#endif
} 

int main(int argc, char *argv[])
{
  int a = 5;
  int b = 6;

  void (*foo)(int,int);
  functionsetter(foo);

   return 0;
}

我无法弄清楚如何通过引用将函数指针foo传递给function-setter函数。有人可以帮我解决这个问题。我相信

的声明 代码中的

functionsetter错误,请告诉我如何修复它。

我正在尝试使用g++ -O2 -g -Wall -DADD main.cpp -o main

进行编译

注意:我想在其他地方的其他代码中使用这样的预处理器标志和函数指针。 如果这样的事情是个好主意,请告诉我。

4 个答案:

答案 0 :(得分:11)

不使用typedef,函数指针引用的语法是:

void functionsetter(void (*&ptr2fun)(int, int)) { ... }

但是为指针类型创建typedef通常更简单:

typedef void (*FunctionPointer)(int, int);

void functionsetter(FunctionPointer& ptr2fun) { ... }

或者对于函数类型:

typedef void Function(int, int);

void functionsetter(Function*& ptr2fun) { ... }

答案 1 :(得分:5)

使用typedef

typedef void (*MyFunctionPointer)(int,int);
void functionsetter(MyFunctionPointer& fp);

  

我想在其他地方的其他代码中使用这样的预处理器标志和函数指针。如果这样的事情是个好主意,请告诉我。

不,不是真的。从你的例子中不清楚你想要完成什么,但你的实现是相当不寻常的。考虑使用虚拟成员函数或std::function在运行时切换函数实现,或者(可能)模板在编译时切换它们。使用条件编译进行静态选择是没有错的,但是将它与函数指针混合有点奇怪。

如果没有很好地理解你想要解决的问题,很难就如何最好地解决它提出好的建议。

答案 2 :(得分:1)

您将签名更改为:

void functionsetter( void (*&ptr2fun)(int,int)  )

请注意,ptr2fun函数指针的签名错误,add和multiply函数返回一个int,因此ptr2fun

如果使用typedef,这会变得容易得多:

typedef int (*ptr2fun)(int,int);
void functionsetter(ptr2fun& func) { ... 

虽然,我个人只是返回函数指针。

ptr2fun functionsetter()
{
#ifdef ADD
  return add;
#endif

#ifdef MULTIPLY 
   return multiply
#endif
}

答案 3 :(得分:1)

首先,你没有将函数指针 reference 传递给方法,你只是传递一个函数指针。您需要将方法签名更改为

void functionsetter( void (*&ptr2fun)(int,int)  )

此外,您的方法签名在某些地方为void(*)(int,int),在某些地方为int(*)(int,int),因为您的add和multiply方法返回int,所以它们可能应该是后者,因为<{1}}。

也就是说,既然你正在使用C ++,那么以这种方式操作指针并不是我推荐的,C ++有继承/虚方法,通常可以取代大多数函数指针使用,并使代码更具可读性和可扩展性