令人困惑的 typedef 涉及类范围

Posted

技术标签:

【中文标题】令人困惑的 typedef 涉及类范围【英文标题】:A confusing typedef involves class scope 【发布时间】: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 没问题。另一个活生生的例子只是更好地改善了你的问题。你已经对这种令人困惑的语法提出了一个很好的问题(现在不太容易),除非有人找到了合适的重复。恭喜。不过,您的问题标题可能会有所改进。 更多信息:msdn.microsoft.com/en-us/library/f2wbycwh.aspx 将其分成两行并利用 C++11 using 语句使其更可口,但不是更多。 Here 是 @πάνταῥεῖ 示例的略微修改版本。 【参考方案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?)

以上是关于令人困惑的 typedef 涉及类范围的主要内容,如果未能解决你的问题,请参考以下文章

typedef有啥用?

typedef 用法总结

类,构造函数,令人困惑的方向

支持向量机如何处理令人困惑的特征向量?

为啥 C 和 C++ 关键字“#defined”或“typedefed”也是它们的大写版本?

你如何解释这个“typedef myType_t (*SpecialFunction_t)(void *);”