根据参数返回指向具有不同签名的函数的指针

时间:2013-11-12 22:21:10

标签: c++ function-pointers function-signature

我见过this link describing a fixed signature example但是想知道如何编写一个返回指向函数的指针的函数,该函数的签名取决于调用函数的参数(如果可能的话)?

示例:

假设我有

typedef void (*func1) (int);
typedef void (*func2) (int, int);

我希望有一个函数get_func,它根据例如整数参数的值返回指向一个或另一个的指针,例如:     get_func1(0)返回func1;     get_func2(1)会返回func2

3 个答案:

答案 0 :(得分:3)

我认为你不能那样做。

您可能想要做的是返回一个指向函数的指针,该函数将一些struct指针作为唯一参数,并且在struct内部您有一个可变数量的参数。

typedef void (*func1) (struct MyStruct*);

然后在MyStruct内:

struct MyStruct {
  int param;
  struct MyStruct* next;
};

或类似的东西。您可以将结构链接在一起,并将所有结构读作“params”。

答案 1 :(得分:2)

我知道我会在这里得到很多支持,但是如果你想要一些东西,渴望得到它,知道风险和同意,你可以降低编译器检查以获得你想要的东西。

下面我向您展示一种获得您想要的方式。我不打算这样做,但如果你认为它正是你想要的,那就继续吧。

#include <iostream>

using namespace std;

typedef void (*func1) (int);
typedef void (*func2) (int, int);

void f1(int)
{
  cout << "f1" << endl;
}

void f2(int, int)
{
  cout << "f2" << endl;
}

void call(int x, void *t)
{
  if ( x ) 
    reinterpret_cast<func1>(t)(0);
  else
    reinterpret_cast<func2>(t)(0, 0);
}

int main()
{
  call(0, reinterpret_cast<void*>(f1));
  call(1, reinterpret_cast<void*>(f2));
}

如前所述,reinterpret_cast正在降低编译器检查,基本上说你应对可能发生的所有错误负责

答案 2 :(得分:0)

怎么样

#include <stdio.h>

typedef void (*func1) (int);
typedef void (*func2) (int, int);

union func12 {
  void* f0;
  func1 f1;  
  func2 f2;
};

void f1(int) {
  printf( "f1\n" );
}

void f2(int, int) {
  printf( "f2\n" );
}

func12 get_func( int x ) {
  func12 r;
  if( x ) r.f2=f2; else r.f1=f1;
  return r;
}

int main() {
  get_func(0).f1(0);
  get_func(1).f2(0,0);
}

http://rextester.com/ZLIXM68236