指向成员数组的静态指针,用于安全的operator []访问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指向成员数组的静态指针,用于安全的operator []访问相关的知识,希望对你有一定的参考价值。

我正在查看boost :: gil的源代码,我在2D点类中看到了这个注释和相应的代码。

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

...
private:
// this static array of pointers to member variables makes operator[]
// safe and doesn't seem to exhibit any performance penalty
static T point2<T>::* const mem_array[num_dimensions];

http://www.boost.org/doc/libs/develop/boost/gil/utilities.hpp

问题:

  1. 这究竟是做什么的?
  2. 这如何使operator[]安全?
答案

数组的定义是相关的 - 它是

template <typename T>
T point2<T>::* const point2<T>::mem_array[point2<T>::num_dimensions] 
    = { &point2<T>::x, &point2<T>::y };

通过指向成员的指向间接使得可以访问点xp坐标作为p.xp[0],并且类似地用于p.yp[1]

否则,有时通过(可能是未定义的)指针技巧或索引上的(可能效率较低)分支来实现。

它当然不是绝对安全的,因为没有边界检查,但它在符合标准和明确定义的意义上是安全的。

以上是关于指向成员数组的静态指针,用于安全的operator []访问的主要内容,如果未能解决你的问题,请参考以下文章

存储指向成员函数的指针不适用于 clang++

当指针指向数组时,为啥 operator(*) 的值不起作用?

如何从静态成员函数调用指向成员函数的指针?

成员函数指针和指向静态成员函数的指针

创建指向二维数组的指针

类成员指针