指向 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; ;
是否可以可移植地编写一个表达式,该表达式将评估给定数组元素的给定属性的指向成员的指针? &bar::foos[2]::x
之类的东西?
应用程序是embind:如果可能,我想将这样的嵌套 C++ 类型映射到线性 javascript 元组。如果使用指向成员的指针不起作用,那么我可能会尝试使用 getter 和 setter 方法,但我仍然想知道是否有办法获得这样的指向成员的指针。
【问题讨论】:
【参考方案1】:我不认为你可以做这样的事情。 foos[2]
不是bar
的成员,只有foos
是。您不能从不是成员的东西中获得指向成员的指针。 C++11 标准第 5.3.1/4 段规定:
只有在使用显式
&
并且其操作数是未括在括号中的 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<int*>(&a)[2*2 + 1] = 42
。
@MvG:恐怕这在 C++ 中是不可能的以上是关于指向 std::array 成员的指针的主要内容,如果未能解决你的问题,请参考以下文章