具有多个可访问参数的C++访客模式
Visitor Pattern in C++ with multiple visitable parameters
考虑以下层次结构:
class Base
{
virtual void Method() = 0;
virtual void Accept(Visitor *iVisitor) = 0;
};
class Derived1: public Base
{
virtual void Method(){//impl}
virtual void Accept(Visitor *iVisitor)
{
iVisitor->Visit(this);
}
};
class Derived2: public Base
{
virtual void Method(){//impl}
virtual void Accept(Visitor *iVisitor)
{
iVisitor->Visit(this);
}
};
和访客类:
class VisitorInterface
{
virtual void Visit(Derived1 * param);
virtual void Visit(Derived2 * param);
}
class Visitor: public VisitorInterface
{
void Visit(Derived1 * param){}
void Visit(Derived2 * param){}
}
通常,当重载方法取决于参数类型时,我使用访问者模式来实现双重调度,但我只有指向基类的指针。
例如:
void foo(Visitor *visitorPtr, Base * basePtr)
{
basePtr->Accept(visitorPtr);
}
我认为这是实现双重调度的唯一方法,因为虚函数的动态绑定应该只发生在调用该方法的对象上,而不是发生在它的参数(派生类型)上。
现在我遇到了一个新情况,我需要一种对多个参数进行重载的 Visit 方法。像这样:
class VisitorInterfaceMultiple
{
virtual void Visit(Derived1 * param1, Derived2 * param2);
virtual void Visit(Derived2 * param1, Derived3 *param2);
}
我无法使用经典的访客模式解决方案,因为仅对其中一个参数调用 accept 方法。
我的问题是:是否存在任何类似的访客模式解决方案或类似的东西,我可以在这种情况下使用?(我需要使用确切的 2 个参数重载访问,不超过 2 个)。
我为您创建了"三重"调度模式:http://ideone.com/FoXNW这很容易。主要部分如下:
class Derived1;
class Derived2;
class Visitor;
class Base
{
public:
virtual void Accept(Visitor &iVisitor, Base& param1) = 0;
virtual void Accept(Visitor &iVisitor, Derived1& param2) = 0;
virtual void Accept(Visitor &iVisitor, Derived2& param2) = 0;
};
class Visitor
{
public:
virtual void Visit(Derived1 & param1, Derived1 ¶m2) { cout << "11n"; }
virtual void Visit(Derived1 & param1, Derived2 ¶m2) { cout << "12n"; }
virtual void Visit(Derived2 & param1, Derived1 ¶m2) { cout << "21n"; }
virtual void Visit(Derived2 & param1, Derived2 ¶m2) { cout << "22n"; }
};
class Derived1: public Base
{
public:
virtual void Accept(Visitor &iVisitor, Base& param1)
{ param1.Accept(iVisitor, *this); }
virtual void Accept(Visitor &iVisitor, Derived1& param2)
{ iVisitor.Visit(*this, param2); }
virtual void Accept(Visitor &iVisitor, Derived2& param2)
{ iVisitor.Visit(*this, param2); }
};
class Derived2: public Base
{
public:
virtual void Accept(Visitor &iVisitor, Base& param1)
{ param1.Accept(iVisitor, *this); }
virtual void Accept(Visitor &iVisitor, Derived1& param2)
{ iVisitor.Visit(*this, param2); }
virtual void Accept(Visitor &iVisitor, Derived2& param2)
{ iVisitor.Visit(*this, param2); }
};
void Visit(Visitor& visitor, Base& param1, Base& param2)
{
param2.Accept(visitor, param1);
}
请注意,Dederd1 和 Derived2 的实现实际上是相同的。如果您有更多派生内容,则可以将其包含在宏中。
相关文章:
- 在访客模式中组合访客
- 隐藏重载虚拟功能的模板化访客:SFINAE 在使用?
- C++提升::获取和访客
- 如何消除访客模式冗余?
- 虚拟模板函数:使用参数实现访客模式
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- 访客设计模式和多层类层次结构
- VirtualBox访客添加汇编
- 具有不同返回类型的变体访客
- 基类中的访客模式
- 提升::访客操作员过载的变体"Error: no match for call to [...]"
- 为什么在 BGL 中的访客中无法更改边缘属性?
- 非周期访客C++
- C++ 访客模式与子类节点上的访客失去"is a"关系
- 访客模式适用于shared_ptr或原始指针?
- 提升变体和访客
- Lambdas的多态性访客
- 工厂返回提升::访客对象
- 提升的访客模式::任何
- 从服务应用程序访问访客帐户系统注册表