この質問は、私が投稿したこの質問の続きです。
私がやろうとしていたこと:私のポイントは、次の制限付きでA
、派生クラスの基本クラスのプライベートメンバーへのアクセスを許可することでした:B
- 私がアクセスしたいのは構造体です -
std::map<>
実際には - メソッドではありません。 - 基本クラスを変更できません。
- 基本クラスには、バックドアの代替手段としてオーバーロードする可能性のあるテンプレート化されたメソッドがありません。また、2 番目の制限に反する
A
ため、そのようなメソッドは追加しません。
考えられる解決策として、litb の解決策 (投稿/ブログ) を指摘されましたが、私の人生では、これらの投稿で何が行われているかを理解できませんでした。私の問題の解決策を導き出さないでください。
私がやろうとしていること: litbのソリューションからの次のコードは、クラス/構造体からプライベートメンバーにアクセスする方法に関するアプローチを示しており、私が言及した制限をカバーしています。
だから、私はこの1つのコードを再配置しようとしています:
template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
// use
struct A {
A(int a):a(a) { }
private:
int a;
};
// tag used to access A::a
struct A_f {
typedef int A::*type;
friend type get(A_f);
};
template struct Rob<A_f, &A::a>;
int main() {
A a(42);
std::cout << "proof: " << a.*get(A_f()) << std::endl;
}
次のことを可能にする何かに-派生クラスの初期化の直後にエントリが追加されるため、クラスを継承しようとしていることに注意してstd::map<>
ください。デフォルト値を使用するため、次の特定のインスタンスからアクセスする必要があります。B
std::map<>
A
B
// NOT MY CODE -- library <a.h>
class A {
private:
std::map<int, int> A_map;
};
// MY CODE -- module "b.h"
# include <a.h>
class B : private A {
public:
inline void uncover() {
for (auto it(A_map.begin()); it != A_map.end(); ++it) {
std::cout << it->first << " - " << it->second << std::endl;
}
}
};
答えとして欲しいもの:適切な変更を加えた後、上記のコードが機能することを本当に望んでいますが、最初のコードブロックで何が行われるかについての説明に非常に満足しています- litbのソリューションからのもの。