这个问题有点类似于我之前发布的这个问题。
我的目标是:允许在派生类B
中访问基类A
的私有成员,但需要遵守以下限制:
- 我要访问的是一个结构体——实际上是一个
std::map<>
,而不是一个方法; - 我不能修改基类;
- 基类
A
没有模板方法可供我重载作为后门替代方案——并且我也不会添加这样的方法,因为这将违反第二个限制。
作为一种可能的解决方案,有人指向了litb的解决方案(帖子 / 博客),但是,我无论如何都无法理解这些帖子中所做的事情,因此,我无法针对自己的问题得出解决方案。
我想做什么:以下代码来自litb的解决方案,它提供了一种访问类/结构体的私有成员的方法,恰好涵盖了我提到的限制。
因此,我正在尝试重新排列这个代码:
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;
}
我希望能有一种方法,让我能够做到以下几点——请注意,我将继承该类,因为在派生类B初始化后,std::map<>
中的条目会立即添加,也就是说,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解决方案中第一个代码块所做的操作,我也会非常满意。