繁体   English   中英

Function 指针指向采用 function 指针的 function

[英]Function pointer pointing to a function that takes a function pointer

如何声明一个指向 function 的 function 指针,将相同的 function 指针作为参数?

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

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

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

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

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

这可能吗?

我非常怀疑它,但是您可以通过引入结构来获得所需的递归。

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; }
};

可以这样:

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

fnptr fn1,fn2;
void func(fn1)
{
/* ... */
}

void func2(fn2)
{
/* ... */
}
void main()
{
fnptr fn = &func;
func2(fn);
}

You can also defeat the type system by pretending that the function takes some other function pointer type, and then casting it when you pass something to the function and inside the function to get the original type back.

显然不推荐,但只是把它放在那里。

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

最简单的方法是只 typedef 两者。 function 指针是一个参数,就像任何其他类型一样:

typedef (* InnerFunctionPtr)(void);
typedef (* OuterFunctionPtr)(InnerFunctionPtr);

编辑:人们已经指出你的意思是两者都是同一类型。 在这种情况下,这是不可能的,因为类型是递归的。 不可能创建完整的类型规范(函数参数的类型从未完全指定,ergo...)

唉,这是做不到的。 如果您可以使用typename来转发声明 typedef,那就太好了; 就像是:

typename fnptr;
typedef (*fnptr)(fnptr);

但这不起作用,因为typename仅限于一些特定的模板使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM