【问题标题】:A confusing typedef involves class scope令人困惑的 typedef 涉及类范围
【发布时间】:2016-02-19 06:32:06
【问题描述】:

我正在阅读一个 C++ 项目的代码,它包含以下形式的一些代码:

namespace ns {
    class A {};
    class B {};
}

struct C {
    typedef ns::A* ns::B::* type;
};

有人可以解释typedef 行的含义吗? type 似乎是某种指向 ns::B 成员的指针,它指向 ns::A,但我不确定。

真实代码中的AB类不为空,但我认为这里不相关。这是live example

【问题讨论】:

  • strange stuff 确实! @JoachimPileborg
  • 看起来像指向成员函数的指针,但缺少参数。也许相当于typedef ns::A* ns::B::* () type;
  • @xovano 没问题。另一个活生生的例子只是更好地改善了你的问题。你已经对这种令人困惑的语法提出了一个很好的问题(现在不太容易),除非有人找到了合适的重复。恭喜。不过,您的问题标题可能会有所改进。
  • 将其分成两行并利用 C++11 using 语句使其更可口,但不是更多。 Here 是 @πάνταῥεῖ 示例的略微修改版本。

标签: c++ typedef pointer-to-member


【解决方案1】:
ns::B::*

B 的指向成员变量的指针。那么ns::A*就是它的类型。

所以整个声明意味着

B 类型 ns::A* 的成员变量的指针

【讨论】:

  • 所以代码似乎没有那么难理解。我需要研究更多关于指向成员的指针:)
  • @xovano 命名空间说明符使它看起来很讨厌。否则像int Foo::* 这样的东西大家都能理解。
【解决方案2】:

The answer by @vsoftco 已经回答了问题的核心。这个答案显示了如何使用这样的typedef

#include <iostream>
#include <cstddef>

namespace ns {

   struct A {};

   struct B
   {
      A* a1;
      A* a2;
   };
}

struct C {
   typedef ns::A* ns::B::*type;
};

int main()
{
   C::type ptr1 = &ns::B::a1;
   C::type ptr2 = &ns::B::a2;

   ns::B b1;
   b1.*ptr1 = new ns::A; // Samething as b1.a1 = new ns::A;

   return 0;
}

【讨论】:

  • b1.*ptr1 哇。所以它本质上是本地指针偏移量? (也就是说,你是在以b的地址为起始点解引用ptr1?)
猜你喜欢
  • 2021-05-15
  • 2011-01-27
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2012-09-12
  • 2022-01-21
  • 2022-01-17
相关资源
最近更新 更多