如何声明一个指向函数的函数指针,该函数指针使用与参数相同的函数指针?
我尝试了以下但没有成功:
typedef void (*fnptr)(void (*)());
void func(fnptr)
{
/* ... */
}
void func2(fnptr)
{
/* ... */
}
void main()
{
fnptr fn = &func;
func2(fn);
}
这可能吗?
答案 0 :(得分:13)
我非常怀疑它,但你可以通过引入一个结构来获得所需的递归。
struct Rec;
typedef void (*RecFun)(const Rec&);
struct Rec {
RecFun fun;
};
使用示例:
#include <iostream>
void nothing(const Rec& rec) {}
Rec recNothing = { nothing };
void f(const Rec& rec)
{
std::cout << "f\n";
rec.fun(recNothing);
}
Rec recF = { f };
void g(const Rec& rec)
{
std::cout << "g\n";
rec.fun(recNothing);
}
Rec recG = { g };
int main()
{
recF.fun(recG);
}
更新:根据Chris,Vitus和Johannes的建议,这里有一些方便的隐式转换(如Herb Sutter的GotW #57):
struct Rec;
typedef void (*RecFun)(const Rec&);
struct Rec {
RecFun fun;
Rec(RecFun fun) : fun(fun) {}
operator RecFun() const { return fun; }
};
答案 1 :(得分:0)
最简单的方法是只输入两个。函数指针就像任何其他类型一样是参数:
typedef (* InnerFunctionPtr)(void);
typedef (* OuterFunctionPtr)(InnerFunctionPtr);
编辑:人们已经指出你们两个都是同一类型。在这种情况下,它是不可能的,因为类型将是递归的。创建一个完整的类型规范是不可能的(函数参数的类型永远不会完全指定,因此...)
答案 2 :(得分:0)
typename
转发声明一个typedef,那就太好了;类似的东西:
typename fnptr;
typedef (*fnptr)(fnptr);
但这不起作用,因为typename
仅限于一些特定的模板使用
答案 3 :(得分:0)
有可能这样:
typedef void (*fnptr)(void (*)());
fnptr fn1,fn2;
void func(fn1)
{
/* ... */
}
void func2(fn2)
{
/* ... */
}
void main()
{
fnptr fn = &func;
func2(fn);
}
答案 4 :(得分:0)
你也可以通过假装函数采用其他函数指针类型来打败类型系统,然后在将函数传递给函数和函数内部时将其转换为原始类型。
显然不推荐,但只是把它放在那里。
typedef void (*fnptr)(void (*)());
void func(void (*x)())
{
fnptr f = (fnptr)x;
/* ... */
}
void func2(void (*x)())
{
fnptr f = (fnptr)x;
/* ... */
}
void main()
{
fnptr fn = &func;
func2((void (*)())fn);
}