指向返回函数指针的函数指针

22

我想声明一个类型为指向返回指针的函数的指针的变量。 实际上就是下面这个内容所做的事情,但没有任何typedef

我希望声明一个指向返回指针的函数的指针类型的变量,类似于以下内容,但不使用任何typedef

typedef void (*func)();
typedef func (*funky_func)();

funky_func ptr;

我尝试了以下方法

(void (*)()) (*ptr)();

但是对于ptr会出现一个"未声明的标识符"错误(可能是由于完全不同的解析而导致)。由于我对C++解析的复杂性不太熟悉,我想知道这是否可能以及如果可能的话,如何做到。

(请将此视为完全人工场景,仅出于好奇目的,并没有任何实际意义。如果使用函数指针,实践中最好使用typedef)。

2个回答

30

您可以查看signal()的声明,它是一个接受void(*)()并返回其中之一的函数。变量ptr可以这样声明:

void (*(*ptr)())()

这个符号有点笨拙,而且明显反了。使用尾返回类型可能更容易:

auto (*ptr)() -> void (*)()

...或者,当然,一直使用尾置返回类型:

auto (*ptr)() -> auto (*)() -> void

28

C(和 C++)声明的一般规则是:如果您将声明作为表达式键入,则它将具有声明的类型。

因此,您想要一个返回指向返回void的函数指针。

假设我们有这样一个指针,ptr。如何从中获取void

  1. 解引用ptr,得到一个返回指向返回void的函数指针的函数:*ptr

  2. 调用该函数,得到一个返回void的函数指针:(*ptr)()

  3. 解引用该指针,得到一个返回void的函数:*(*ptr)()

  4. 调用该函数,得到void:(*(*ptr)())()

现在只需要将其转换为声明:

void (*(*ptr)())();

顺便说一句,我知道其他人已经回答了(我已经点赞了)。但是我想展示到达声明表的通用流程。


2
“我想展示通用的流程,以便到达声明表格。” ——这种优秀的方式,我可以从你的回答中快速掌握。谢谢! - Grijesh Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接