有人能给我解释一下 C++ 中复杂的函数指针类型吗
Can someone please explain to me a complicated function pointer type in C++
谁能告诉我函数的参数类型是什么f
?
int f(void (*(int,long))(int,long)) {}
我在尝试编译一些可变参数模板重代码(我自己的 std::thread
包装器)时得到了与此类似的类型...
它是一个函数,它接受一个以int
和long
为参数的函数的指针,return是一个以int
和long
为参数的函数参数和 returns void
。如果使用尾随 return 类型并命名函数,可能会更清楚:
int f(auto g(int, long) -> void (*)(int, long));
宣言
int f(void (*(int,long))(int,long)) {}
声明一个函数 f
返回 int
并将一个指向带有 int, long
参数的函数的指针和 returns 一个指向 returns 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));
...并且您希望编译器使用较低的通用形式。
在函数声明中
int f(void (*(int,long))(int,long));
使用了混淆形式的函数指针。让我们从基础开始理解这段代码。
void (*f_ptr)(long);
将 f_ptr
声明为指向需要 long
参数且 return 没有任何参数的函数的指针。
作为函数的参数,该函数指针可以声明为
int f1( void f_ptr(int) );
int f2( void (*f_ptr)(int) );
void f_ptr(int)
和void (*f_ptr)(int)
两者作为函数参数是相同的。现在将 f_ptr
的 return 类型更改为指向 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
是一个指向需要 int
和 long
类型参数的函数的指针,而 returns 是一个指向需要 int 和长型参数和 returns void
。
谁能告诉我函数的参数类型是什么f
?
int f(void (*(int,long))(int,long)) {}
我在尝试编译一些可变参数模板重代码(我自己的 std::thread
包装器)时得到了与此类似的类型...
它是一个函数,它接受一个以int
和long
为参数的函数的指针,return是一个以int
和long
为参数的函数参数和 returns void
。如果使用尾随 return 类型并命名函数,可能会更清楚:
int f(auto g(int, long) -> void (*)(int, long));
宣言
int f(void (*(int,long))(int,long)) {}
声明一个函数 f
返回 int
并将一个指向带有 int, long
参数的函数的指针和 returns 一个指向 returns 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));
...并且您希望编译器使用较低的通用形式。
在函数声明中
int f(void (*(int,long))(int,long));
使用了混淆形式的函数指针。让我们从基础开始理解这段代码。
void (*f_ptr)(long);
将 f_ptr
声明为指向需要 long
参数且 return 没有任何参数的函数的指针。
作为函数的参数,该函数指针可以声明为
int f1( void f_ptr(int) );
int f2( void (*f_ptr)(int) );
void f_ptr(int)
和void (*f_ptr)(int)
两者作为函数参数是相同的。现在将 f_ptr
的 return 类型更改为指向 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
是一个指向需要 int
和 long
类型参数的函数的指针,而 returns 是一个指向需要 int 和长型参数和 returns void
。