我见过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
。
答案 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);
}