所以我看了一些东西,发现了这个线程别名结构和数组的C++方式
这就是问题的答案
#include <math.h>
struct Point {
double x;
double y;
double z;
};
double dist(struct Point *p1, struct Point *p2) {
constexpr double Point::* coords[3] = {&Point::x, &Point::y, &Point::z};
double d2 = 0;
for (int i=0; i<3; i++) {
double d = p1->*coords[i] - p2->*coords[i];
d2 += d * d;
}
return sqrt(d2);
}
现在我的问题是我不知道
constexpr double Point::* coords[3] = {&Point::x, &Point::y, &Point::z};
应该做的是。。。
我知道constexpr
使其成为在编译时定义的常量,而使用double
显然是因为该结构包含双数,但point::*
和{&point::x,&point::y,&point::z};
使我感到困惑。 首先,什么是point::*
? 我猜*表示它是某种指针,但是指向什么呢? 这些地址{&point::x,&point::y,&point::z}
是什么?
这整个表达式到底定义了什么?
此语法是指向成员的指针,本质上是将成员存储到变量并检索它的一种方式。 这对于像这样的情况很有用,当您希望循环遍历一个成员列表时。