有人可以向我解释一个复杂的函数指针类型吗C++

Can someone please explain to me a complicated function pointer type in C++

本文关键字:函数 复杂 指针 类型 C++ 一个 可以向 解释      更新时间:2023-10-16

谁能告诉我函数f的参数类型是什么?

int f(void (*(int,long))(int,long)) {}

在尝试编译一些可变参数模板重代码时,我得到了与此类似的类型(我自己的包装器std::thread(......

声明

int f(void (*(int,long))(int,long)) {}

声明一个函数f返回int,并将指向int, long参数的函数的指针作为参数,并返回指向返回void并获取参数int, long的函数的指针。将 typedef 用于最里面的函数指针,这变得更加可读:

typedef void (*fptr)(int, long);
int f(fptr(int, long));

或者使用命名参数,

int f(fptr handler(int, long));

这是完全有效的代码,但在编译器输出中看到它很奇怪,因为它使用特殊的语法规则:在函数参数列表中,函数类型声明符声明函数指针参数。也就是说,

int f(fptr   handler (int, long)); // is equivalent to
int f(fptr (*handler)(int, long));

。并且您希望编译器使用较低的常规形式。

它是一个

函数,它采用指向一个函数的指针,该函数将intlong作为参数,并返回一个以intlong为参数并返回void的函数。如果您使用尾随返回类型并命名函数,可能会更清晰:

int f(auto g(int, long) -> void (*)(int, long));

在函数声明中

int f(void (*(int,long))(int,long));  

使用函数指针的模糊形式。让我们从基本开始理解此代码。

void (*f_ptr)(long);  

f_ptr 声明为指向需要 long 参数且不返回任何内容的函数的指针。

作为函数的参数,此函数指针可以声明为

int f1( void f_ptr(int) );
int f2( void (*f_ptr)(int) );  

void f_ptr(int)void (*f_ptr)(int)都与函数参数相同。现在将f_ptr的返回类型更改为指向void的指针 ( void * (

int f1( void *f_ptr(int) ); // f_ptr is a function pointer that expects an int type and 
                            // returns a pointer to void    
int f2( void *(*f_ptr)(int) );  

可以删除函数参数的名称,因此上述声明将变为

int f1( void *(int) );
int f2( void *(*)(int) );  

现在,您可以对原始函数声明进行去混淆

int f( void ( *(int, long) ) (int, long) );    

int f( void ( *(*)(int, long) ) (int, long) );    

您可以为函数指针放置一个名称

 int f( void ( *(*func_ptr)(int, long) ) (int, long) );  

因此,func_ptr 是指向需要 intlong 类型参数的函数的指针,并返回指向需要 int 和 long 类型参数并返回 void 的函数的指针。