这个问题在某种程度上是我发布的这个问题的延续。
我想做的是:我的意思是允许访问A
派生类中基类的私有成员B
,但有以下限制:
- 我想要访问的是一个结构——
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;
}
对于允许我执行以下操作的事情 - 请注意,我即将继承该类,因为在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 的解决方案。