提问者:小点点

constexpr double Point::*Coords[3]到底是如何工作的? [副本]


所以我看了一些东西,发现了这个线程别名结构和数组的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}是什么?

这整个表达式到底定义了什么?


共1个答案

匿名用户

此语法是指向成员的指针,本质上是将成员存储到变量并检索它的一种方式。 这对于像这样的情况很有用,当您希望循环遍历一个成员列表时。