Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用typedef包装函数_C++_Function_Pointers_Wrapper_Typedef - Fatal编程技术网

C++ 使用typedef包装函数

C++ 使用typedef包装函数,c++,function,pointers,wrapper,typedef,C++,Function,Pointers,Wrapper,Typedef,我的一位老师使用以下类型声明: typedef void (*SortFunction)(int a[], int n); 创建可以保存函数指针的类型的步骤 这可以用于以后在程序中调用该函数 我还知道,要将函数作为参数传递,必须 将函数名括在括号中,并将函数的 函数名后面的括号中的参数 function someFunction( (anotherfunction)(type arg1, type arg2,...)){ ... } 我想知道的是,为什么必须像这样用括号括起一个函数?这

我的一位老师使用以下类型声明:

typedef void (*SortFunction)(int a[], int n);
创建可以保存函数指针的类型的步骤 这可以用于以后在程序中调用该函数

我还知道,要将函数作为参数传递,必须 将函数名括在括号中,并将函数的 函数名后面的括号中的参数

function someFunction( (anotherfunction)(type arg1, type arg2,...)){
  ...
} 
我想知道的是,为什么必须像这样用括号括起一个函数?这是大多数C++编译器的内置函数,还是程序员使用的技巧? 为了在代码中启用函数作为参数?还有,为什么“SortFunction”
在需要引用的typedef语句中,为什么用于使用SortFunction的变量不能只保留函数而不是指向它?

函数参数没有什么特别之处。无论何时声明函数指针(作为局部变量、全局变量、类成员变量、函数参数、typedef等),它总是这样声明:

return_type (*var_name)(T1 param1, T2 param2, /* etc. */ );
//           ^
//           |
// This * is very important!
其中,
var\u name
是函数指针变量的名称。在
*var_name
周围需要括号的原因是由于运算符优先级:如果没有括号,
*
(表示某个对象是指针)将与函数的返回类型匹配,相反,您将得到类似于
int*
的返回类型(指向
int
)而不是普通的
int


不能传递函数作为参数,因为函数不是C和C++中的第一类对象。传递函数的唯一方法是传递指向函数的指针。

这是语法问题。您的第一个
typedef
定义了一个类型,该类型是一个函数,它接收
int
向量和
int
,但不返回任何内容(
void

类型为
SortFunction
的变量在概念上与任何其他变量相同,尽管它指向某个函数。优点是您可以更改它指向的函数和/或动态调用该函数

我想知道的是,为什么必须像这样用括号括起一个函数

因为必须有某种方法来识别指向编译器(或者更确切地说,解析器)的函数指针,而且这种方法似乎和任何方法一样好。在C++11Land中,您可以改为使用:
std::function

这是大多数C++编译器的内置函数,还是它只是程序员使用的一个技巧,以便使函数成为我们代码中的参数?

函数指针需要一点额外的魔力,如果没有编译器支持,它们将非常非常不方便使用。我还可以合理地确定,在编程的本质上,几乎所有的程序员技巧最终都是编译器的功能

另外,为什么typedef语句中的“SortFunction”需要被引用,为什么用于利用SortFunction的变量不能只保留函数而不是指向它

嗯,我不太清楚你在这里的意思。你的意思是“为什么这需要是一个
typedef
…为什么我不能在函数参数中写出整个函数指针原型”?因为你可以:

void foo(void(*funcptr)()) {}
如果您的意思是“为什么函数指针必须指向函数而不是内联代码”,那么您需要C++11和lambdas:

#include <iostream>
#include <functional>

void foo(std::function<void(void)> bar) { bar(); }

int main(int argc, char* argv[])
{
    foo([]() { std::cout << "hi!" << std::endl; });
}
#包括
#包括
void foo(std::函数栏){bar();}
int main(int argc,char*argv[])
{
foo([](){std::cout“我还知道,要将函数作为参数传递,必须将函数名括在括号中…”您“知道”不正确

为了将函数指针作为参数传递,您不必将名称括在括号中

void foo(int i) {
} 

void bar(void f(int)) {
  f(5);
}

int main() {
  bar();
}
在上面的示例中,函数
bar
接收一个指向函数
foo
的指针作为参数,并通过该指针调用
foo
,将
5
作为参数传递。如您所见,参数声明中的函数名
f
并没有用括号括起来

在这种情况下,参数
f
的类型实际上是指向函数的指针,即使它没有显式声明为指针。当函数类型用于函数参数声明时,编译器会自动将其隐式地“替换”为函数指针类型

如果要显式使用函数指针类型,必须将
bar
声明为

void bar(void (*f)(int)) {
  f(5);
}

在这种情况下,
(*f)
中的括号是必要的,以确保
*
将绑定到
f
而不是
void
。没有括号,
void*f(int)
声明将代表“函数返回
void*
”,而不是所需的“返回函数的指针
void
".

请注意,如果我正确阅读最新的C++11标准,上下文无关的lambda可以隐式地转换为函数指针。@Yakk你可能是对的,但我手头的两个编译器都不支持这一点。不过,它们都没有特别强的C++11支持。是的,我相信,这是在标准化周期的后期添加的。或者可能没有添加,只是考虑一下。。。