【发布时间】:2013-02-13 04:01:30
【问题描述】:
这个问题在某种程度上是我发布的this one 的延续。
我想做的事:我的意思是允许在派生类B 中访问基类A 的私有成员,但有以下限制:
- 我要访问的是一个结构——实际上是一个
std::map<>——而不是一个方法; - 我无法修改基类;
- 基类
A没有模板化方法,我可以作为后门替代方案重载——而且我不会添加这样的方法,因为它会反对第二个限制。
作为一种可能的解决方案,我被指出了 litb 的解决方案 (post / blog),但是,就我的一生而言,我无法理解这些帖子中所做的事情,因此,我无法找到解决问题的方法。
我正在尝试做的事情:来自 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 的解决方案。
【问题讨论】:
-
为什么需要得出自己的解决方案?使用 litb 的代码作为库。你想要一个更易于管理的版本吗?我在某一时刻更好地封装了它。但我认为,如果没记错的话,他实际上有一个独立的版本。
-
@Potatoswatter 这里的问题是我什至不知道该解决方案是否适用于我的问题。我无法在我的代码中实际使用它——主要是因为我还没有真正理解在 libt 的解决方案中做了什么。
标签: c++ class templates inheritance private