2017-12-18 3 views
0

나는 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[]이 안전할까요?
+1

주석은 "안전"을 정의하지 않기 때문에 그것이 의미하는 바가 무엇인지 또는 어떻게 작동 하는지를 말하는 것은 불가능합니다. 물론, 의도 한대로 ** 추측 할 수 있으며 추측이 암시하는 바가 무엇이든 할 수 있는지에 대한 가설을 세울 수 있습니다. –

답변

2

배열의 정의는 관련 - 그것은 포인터 투 부재를 통해 간접

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

이다는 xp.x 또는 p[0] 하나로서 점 p 좌표 액세스 가능하게, 또한 p.yp[1]에 대해서도 마찬가지입니다.

다른 방법으로는 때때로 포인터 속임수 또는 색인의 분기 효율이 떨어지는 경우가 있습니다.

경계 검사가 없으므로 절대 안전한 것은 아니지만 표준을 준수하고 잘 정의되어 있다는 의미에서 안전합니다.

+0

감사합니다. 그게 옳은 대답 인 것 같습니다. 나는 "안전하다"라는 단어가 여기서 성취 된 것에 대한 최고의 단어인지 확실하지 않습니다. 꽤 멋진. – wmkn

관련 문제