【发布时间】:2015-06-25 09:51:21
【问题描述】:
这是this question的后续行动。
我们可以根据this answer的建议,针对上一题的问题实现访问者模式:
class Base {
foo(Parent& p) {
p.accept(*this);
}
virtual void visit(Child_A&) = 0;
virtual void visit(Child_B&) = 0;
};
class Parent {
virtual void accept(Base&) = 0;
};
class Child_A: Parent {
void accept(Base& v) {
v.visit(*this);
}
};
class Child_B: Parent {
void accept(Base& v) {
v.visit(*this);
}
};
class Derived_A: Base {
void treat_same(Parent&) {
// ...
}
void visit(Child_A& a) {
treat_same(a);
}
void visit(Child_B& b) {
treat_same(b);
}
};
class Derived_B: Base {
void visit(Child_A&) {
// ...
}
void visit(Child_B&) {
// ...
}
};
但现在考虑foo 是否期望std::vector<std::shared_ptr<Parent>> const& 作为其参数。
那么我们如何实现这个问题的访问者模式呢?有可能吗?
编辑
foo 将std::vector<std::shared_ptr<Parent>> const& 传递给另一个类state。但如果向量中的所有对象都是Child_A 类型,则调用state.method_A,如果向量中的所有对象都是Child_B 类型,则调用state.method_B,否则调用state.method_C。只有 state 直接与 parent 类一起使用。
我希望这能澄清一些事情。
【问题讨论】:
-
我不明白你在问什么。你想让
foo做什么? -
另外,不确定您是否可以创建
std::vector<Base&>。 -
你想要什么行为?您可以依次访问每个元素或将容器视为一个整体。也就是说,
Base类中的foo()是什么?课堂上的treat_same()是什么Derived_A?我还想指出,调用Base和Derived和Parent和Child不会使代码更清晰,为什么没有例如Visitor基类代替? -
我认为使用
std::vector<>可以获得的最接近的东西是std::vector<unique_ptr<Base>>,但请注意所有权已转移。 -
@Barry,我更正了。
标签: c++ class c++11 vector visitor-pattern