函数指针指向一个带有函数指针的函数

时间:2011-05-25 17:19:14

标签: c++ function-pointers

如何声明一个指向函数的函数指针,该函数指针使用与参数相同的函数指针?

我尝试了以下但没有成功:

typedef void (*fnptr)(void (*)());

void func(fnptr)
{
    /* ... */
}

void func2(fnptr)
{
    /* ... */
}

void main()
{
    fnptr fn = &func;
    func2(fn);
}

这可能吗?

5 个答案:

答案 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);
}