指向 std::array 成员的指针

Posted

技术标签:

【中文标题】指向 std::array 成员的指针【英文标题】:Pointer to member for std::array 【发布时间】:2013-05-23 22:44:23 【问题描述】:

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

struct foo  int x, y; ;
struct bar  std::array<foo, 4> foos; ;

是否可以可移植地编写一个表达式,该表达式将评估给定数组元素的给定属性的指向成员的指针? &amp;bar::foos[2]::x 之类的东西?

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

【问题讨论】:

【参考方案1】:

我不认为你可以做这样的事情。 foos[2] 不是bar 的成员,只有foos 是。您不能从不是成员的东西中获得指向成员的指针。 C++11 标准第 5.3.1/4 段规定:

只有在使用显式 &amp; 并且其操作数是未括在括号中的 qualified-id 时,才会形成指向成员的指针。

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

&class_name::member_name

其中class_name 本身可以是限定名称。不允许使用下标运算符或其他花哨的符号。

【讨论】:

好的,所以直观的成员指针表达式无效。但这是否表示我无法使用其他一些聪明的方法获得int foo::*?像一些指针算法来组合各个偏移量,或者一些offsetof thingy,或者类似的东西?毕竟,所有这些都有已知的类型和偏移量,所以在技术上似乎是可行的。 @MvG:嗯,但是你会用那个int做什么? AFAIK 指向成员的指针的表示是未指定的,所以我不认为你的代码是可移植的。即使它被指定了,你也不会得到一个指向成员的指针,因为foos[2] 不是A 的成员。您将无法执行 a.*pF2 = 42 之类的操作。 我希望有一些int foo::*ptm 这样a.*ptm = 42 就等于a.foos[2].y = 42。这又相当于reinterpret_cast&lt;int*&gt;(&amp;a)[2*2 + 1] = 42 @MvG:恐怕这在 C++ 中是不可能的

以上是关于指向 std::array 成员的指针的主要内容,如果未能解决你的问题,请参考以下文章

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

编译期间的 std::array 类成员集?

C++指向对象成员的指针

C++指向对象成员的指针

如何静态断言 std::array 成员的大小

std::array<T, ?> 类型的成员变量