C++ 指向std::数组成员的指针

C++ 指向std::数组成员的指针,c++,c++11,emscripten,stdarray,C++,C++11,Emscripten,Stdarray,假设我有一个包含另一种结构类型的对象数组的结构,如下所示: struct foo { int x, y; }; struct bar { std::array<foo, 4> foos; }; structfoo{intx,y;}; 结构条{std::array foos;}; 是否可以移植地编写一个表达式,该表达式将针对给定数组元素的给定属性计算为指向成员的指针?类似于&bar::foos[2]::x :@ MVG:恐怕这是C++中不可能的。

假设我有一个包含另一种结构类型的对象数组的结构,如下所示:

struct foo { int x, y; };
struct bar { std::array<foo, 4> foos; };
structfoo{intx,y;};
结构条{std::array foos;};
是否可以移植地编写一个表达式,该表达式将针对给定数组元素的给定属性计算为指向成员的指针?类似于
&bar::foos[2]::x


<应用程序是:如果可能的话,我想把一个嵌套的C++类型映射到一个线性JavaScript元组。如果使用指向成员的指针不起作用,那么我可能会尝试改用getter和setter方法,但我仍然想知道是否有办法获得指向成员的指针。

我认为您不能这样做
foos[2]
不是
bar
的成员,只有
foos
是。您无法从非成员的对象获取指向成员的指针。C++11标准第5.3.1/4段规定:

仅当使用显式
&
且其操作数是不包含在括号中的限定id时,才会形成指向成员的指针

这意味着语法本身阻止您编写任何看起来不像:

&class_name::member_name

其中,
class\u name
本身可以是限定名。不允许使用下标运算符或其他花哨的表示法。

我认为你不能这样做
foos[2]
不是
bar
的成员,只有
foos
是。您无法从非成员的对象获取指向成员的指针。C++11标准第5.3.1/4段规定:

仅当使用显式
&
且其操作数是不包含在括号中的限定id时,才会形成指向成员的指针

这意味着语法本身阻止您编写任何看起来不像:

&class_name::member_name

其中,
class\u name
本身可以是限定名。不允许使用下标运算符或其他奇特的表示法。

OK,因此指向成员表达式的直观指针无效。但这是否意味着我无法使用其他聪明的方法获得
intfoo::*
?比如一些指针算法来组合各个偏移量,或者一些偏移量之类的?毕竟,所有这些都有已知的类型和偏移量,所以从技术上看是可行的。@MvG:Hum,但是你会如何处理
int
?AFAIK指向成员的指针的表示形式是未指定的,因此我认为您的代码不会是可移植的。即使指定了它,您也不会得到指向成员的指针,因为
foos[2]
不是
a
的成员。您将无法执行类似于
a.*pF2=42
的操作。我希望有一些
int foo::*ptm
,这样
a.*ptm=42
就相当于
a.foos[2]。y=42
。这又相当于
reinterpret\u cast(&a)[2*2+1]=42
@MvG:恐怕在C++OK中这是不可能的,因此指向成员表达式的直观指针是无效的。但这是否意味着我无法使用其他聪明的方法获得
intfoo::*
?比如一些指针算法来组合各个偏移量,或者一些偏移量之类的?毕竟,所有这些都有已知的类型和偏移量,所以从技术上看是可行的。@MvG:Hum,但是你会如何处理
int
?AFAIK指向成员的指针的表示形式是未指定的,因此我认为您的代码不会是可移植的。即使指定了它,您也不会得到指向成员的指针,因为
foos[2]
不是
a
的成员。您将无法执行类似于
a.*pF2=42
的操作。我希望有一些
int foo::*ptm
,这样
a.*ptm=42
就相当于
a.foos[2]。y=42
。这又等同于<代码> ReRealtTySCAPE((a))[2×2 +1 ]=42 < /C>:@ MVG:恐怕这是C++中不可能的。