2017-12-18 18 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

アレイの定義が適切である - それは、ポインタツー部材を介して間接にxp.x又はp[0]のいずれかとして点pの座標にアクセスすることを可能に

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

あります同様にp.yおよびp[1]についても同様である。

これは、(おそらく定義されていない)ポインタトリッキーまたはインデックス上の(効率的ではない可能性がある)ブランチによって達成されることがあります。

もちろん、境界チェックがないので絶対に安全ではありませんが、標準に準拠し、明確に定義されているという意味では安全です。

+0

ありがとうございます。それは正解と思われます。 「安全な」という言葉がここで成し遂げられたことの最良の言葉であるかどうかはわかりません。かなり元気だ。 – wmkn

関連する問題