先看一个极其复杂的函数声明:
std::string (*(*returnFunction(std::string (*(*pf)(std::initializer_list<std::string> list))[5]))(std::initializer_list<std::string> list))[5];
特别长,一页几乎不能显示完全。
然后看其函数名,参数类型,及返回类型。几乎也是完全看不出分别是什么。
如果换一种表达方式:
auto returnFunction(std::string (*(*pf)(std::initializer_list<std::string> list))[5])
-> std::string (*(*)(std::initializer_list<std::string> list))[5];
这样能一眼看出返回值类型了,还有函数名。参数列表也能看清楚了。
不过这种表示还是不太直观。
再换一种表达方式呢?
using pm = std::string (*(*)(std::initializer_list<std::string> list))[5];
pm returnMethod(pm from);
这种是不是就非常清晰了。就算完全不懂 c++ ,也知道这个函数声明表达的是什么了。
还有一种传统的简化方式。
typedef std::string (*(*ptm)(std::initializer_list<std::string> list))[5];
ptm returnTypeMethod(ptm from);
以上4种,其实是完全相同的函数描述。返回类型,参数列表都是完全相同的。
3,4是非常简单易懂的。不过现在只是直到这个函数的参数类型与返回值类型相同,还不知道这个参数类型或者说返回值类型,到底是什么类型。
那就先看这个东西是什么: std::string (*(*ptm)(std::initializer_list<std::string> list))[5]
。
ptm
是一个指针(*ptm)
后面有参数列表,所以*ptm
是一个函数- 这个函数的返回值是一个指针
- 返回值的指针,指向一个长度为5,元素为 string 类型的数组。
综合:ptm
是一个函数指针。指向的是一个函数,其参数是一个 initializer_list
类型的对象,其返回值是一个指针,该指针指向的是一个长度为5,元素为 string 类型的数组。
那么,上面定义的函数就是这么一个函数,参数与返回值都是 ptm
类型的。