在* C ++模板中,:: *(范围操作后的星号)是什么意思?

时间:2014-08-06 11:02:51

标签: c++

请帮助我理解Facebook Pop的代码片段:PopVector.h

模板类Vector2包含一个静态成员_v,它看起来像是支持Vector2实例的数据:

private:
    typedef T Vector2<T>::* const _data[2];
    static const _data _v;

_v由以下行实例化:

template<typename T>
  const typename Vector2<T>::_data Vector2<T>::_v = { &Vector2<T>::x, &Vector2<T>::y };

然后_v用于实现索引运算符:

const T& operator[](size_t i) const { return this->*_v[i]; }
T& operator[](size_t i) { return this->*_v[i]; }

我不熟悉这种代码模式,并且有几个问题:

  1. typedef行是什么意思?我不明白Vector2<T>::*
  2. 为什么_v必须是静态成员?它似乎不是跨实例共享的,它不遵循C ++ AFAICT中的静态语义。

1 个答案:

答案 0 :(得分:8)

无论是在模板中还是在其他地方,::*只是一个C ++令牌 在上下文中可用于类型表达式 CLASS_NAME 的:: *。它声明了一个指向成员的指针。

在您的情况下,typedef表示_data是别名 指向Vector2<T>成员的const指针 T const[2]

编辑:

我的实际定义错误:_dataVector2<T> T成员的const指针数组[2]的别名。这在实例化中很明显,其中对象用两个指向成员的指针初始化。