c++ - 指向成员的成员的指针

标签 c++ c++11 pointer-to-member

C++ 允许定义指向类成员的指针,例如:

struct A
{
  int i;
};

void a()
{
  int A::*p = &A::i;
}
但是如果我想要一个指向像这样更深“级别”的成员的指针怎么办?
struct A
{
  int i;
  struct B{int j;};
  B b;
};

void a()
{
  int A::*p = &A::b::j;
}
从理论上讲,如果指向成员的指针从对象的开头编译为偏移量,这可能很容易被语言支持,尽管像虚拟/菱形继承(钻石问题)之类的东西可能会使这过于复杂
在没有性能损失或未定义行为的情况下实现这一目标的最简单方法是什么?
我的第一个想法是仅使用偏移量并使用对象上的原始指针,但这似乎可能不是定义的行为,并且还会使编译器无法检测我是否指向具有正确类型的实际字段

最佳答案

您只能为给定类的实际数据成员定义指向数据成员的指针。
你声明了一个嵌套类类型在这里并不是特例:你可以提取一个指针作为 A::B 的数据成员。并将指向数据成员的指针应用到 b A::B 的成员(类型为 A)目的:

#include <iostream>

struct A {
  int i;
  struct B{ int j; };
  B b;
};

int main() {
    A a{1, {42}};  // a.b.j is 42
    
    // Declare a pointer-to-data-member of B (which
    // is a nested class in A).
    int A::B::*p = &A::B::j;
    
    // Apply to an actual 'B' object to retrieve
    // the data member value pointed to.
    std::cout << a.b.*p;  // 42
}
但是,如果您想在 A 上应用指向数据成员的指针,对象,你能得到的最好的就是指向数据成员 b 的指针.
对于嵌套类对象,您始终可以使用指向数据成员指针的嵌套指针:
int main() {
    A a{1, {42}};  // a.b.j is 42
    
    A::B A::*pb = &A::b;
    int A::B::*pj = &A::B::j;
    std::cout << (a.*pb).*pj;  // 42
}

关于c++ - 指向成员的成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64916237/

相关文章:

c++ - C++ 如何选择要使用的运算符重载?

c++ - Clang 提示 POD 类实际上是非 POD

c++ - 如何散列和比较指向成员函数的指针?

指向模板类的非静态成员函数的 C++ 函数指针(类成员)

c++ - 为什么在这种情况下不能推导出模板参数?

c++ - 使用 C++ 在不同选项卡中显示相同 QWidget 的 QTabWidget 或 QTabBar

c++ - 具有 PBO 支持的高级 OpenGL 库

c++ - C++ 输出时出现段错误

c++ - C++11 标准是否要求通过常量 unordered_container 的两次迭代以相同的顺序访问元素?

c++ - 比较 unordered_map 与 unordered_set