c++ - 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}
什么?
这整个表达式到底定义了什么?
解决方案
此语法是指向 member的指针,本质上是一种将成员存储到变量并检索它的方法。当您想要遍历成员列表时,这对于这种情况很有用。
推荐阅读
- django - 使用带有注解的 Django CheckConstraint
- python - 读取每个 url 并将其保存到单独的 pdf Python
- xamarin - 从一个详细信息页面到另一个详细信息页面时如何保存页面上的信息
- javascript - React Hooks 上的 useState 不更新数组
- python - 如果某些值是 NaN,我如何对 DataFrame 中的 2 个特定列行求和?
- angular - Ionic 4 - 在指令上获取 ElementRef 属性
- vue.js - 由于重复“请运行 npm install -g @vue/cli-upgrade 并重试”,无法升级 vue cli。
- database - 如何从 DataGridView 编辑行?MS Access 数据库
- c++ - 在 C++ 中将内部模板类作为模板参数传递
- r - ggmap和空间数据绘图问题