令人困惑的 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
,但我不确定。
真实代码中的A
和B
类不为空,但我认为这里不相关。这是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 涉及类范围的主要内容,如果未能解决你的问题,请参考以下文章