完全に準拠した方法でそれを行う方法を示すエントリをブログに追加しました。次のクラスでの使用方法の例を次に示します。
struct A {
private:
int member;
};
次の例に示すように、タグ名を宣言し、robber をインスタンス化するだけです (私の投稿では、robber の実装を示しています)。その後、メンバー ポインターを使用してそのメンバーにアクセスできます。
struct Amem { typedef int type; };
template class rob<Amem, &A::member>;
int main() {
A a;
a.*result<Amem>::ptr = 42; // Doh!
}
しかし実際には、これは c++ のアクセス ルールが信頼できないことを示しているわけではありません。言語規則は、偶発的な間違いから保護するように設計されています。オブジェクトのデータを盗もうとしても、言語の設計により、阻止するのに長い道のりはかかりません。
上記は、準拠した方法でプライベートおよび保護されたメンバーにアクセスする方法です。これは、標準に準拠した方法で保護されたメンバーにアクセスする別の方法です。基本的な考え方は、メンバーポインターを使用することです
std::deque<int> &getAdapted(std::stack<int> &s) {
struct voyeur : stack<int>
{ using stack<int>::c; };
return s.*(&voyeur::c);
}
int main() {
std::stack<int> s;
std::deque<int> &adapted = getAdapted(s);
output(adapted); // print the stack...
}
キャストやタイプのパニングは含まれていません。std::stack<int>
メンバー名がパブリックなクラスから派生したクラスを介して、保護されたメンバーへのポインターを取得するため、コンパイラーはこれを許可します。次に、std::stack<int>
オブジェクトでそれを使用しますが、これも許可されています。