嗯,它是一个 typedef,所以有两部分 - 类型和为其定义的新名称。
第一部分是类型:
bool (*)(const Shape* s1, const Shape* s2);
这是一个指向函数的指针,接受两个指向 const-Shape 参数的指针,并返回 bool。
第二部分是类型的名称:compareShapes。诚然,函数指针类型定义很难阅读,但这部分是因为函数指针语法不经常使用。
因此,例如,我可以编写任意数量的兼容函数:
bool identical(const Shape *a, const Shape *b);
bool strictlyContained(const Shape *a, const Shape *b);
bool topologicallyEquivalent(const Shape *a, const Shape *b);
这告诉我a 是否与b 相同,或者完全在b 内部,或者a 和b 是否具有相同数量的孔。
然后,我可以编写适用于任何比较的代码,并选择以后使用的代码,例如:
compareShapes cmp;
if (shouldUseIdentityComparison()) {
cmp = &identical;
} else if (shouldUseInsideComparison()) {
cmp = &strictlyContained;
} else {
cmp = &topologicallyEquivalent;
// ...
if (cmp(a,b)) {
// they're equal, for whichever comparison we chose above
}
在现代代码中可能更常见的是编写模板,采用任意比较器类型(如std::sort),或者编写采用std::function<bool(const Shape*, const Shape*)> 的非模板函数,这比原始函数更灵活指针。
C 没有(并且早期版本的 C++ 没有)这些功能,因此必须使用函数指针。我怀疑它们主要用于与旧代码向后兼容,并且可能用于资源受限的环境中。