首页 > 解决方案 > constexpr double Point::* coords[3] 究竟是如何工作的?

问题描述

所以我一直在看一些东西,发现这个线程Aliasing struct and array the C++ way

这就是问题的答案

#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}什么?

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

标签: c++pointersstruct

解决方案


此语法是指向 member的指针,本质上是一种将成员存储到变量并检索它的方法。当您想要遍历成员列表时,这对于这种情况很有用。


推荐阅读