在访问者模式的典型实现中,类必须考虑基类的所有变体(后代)。在很多情况下,访问者中的相同方法内容应用于不同的方法。在这种情况下,模板化的虚拟方法是理想的,但目前还不允许这样做。
那么,模板化的方法可以用来解析父类的虚方法吗?
给定(基础):
struct Visitor_Base; // Forward declaration.
struct Base
{
virtual accept_visitor(Visitor_Base& visitor) = 0;
};
// More forward declarations
struct Base_Int;
struct Base_Long;
struct Base_Short;
struct Base_UInt;
struct Base_ULong;
struct Base_UShort;
struct Visitor_Base
{
virtual void operator()(Base_Int& b) = 0;
virtual void operator()(Base_Long& b) = 0;
virtual void operator()(Base_Short& b) = 0;
virtual void operator()(Base_UInt& b) = 0;
virtual void operator()(Base_ULong& b) = 0;
virtual void operator()(Base_UShort& b) = 0;
};
struct Base_Int : public Base
{
void accept_visitor(Visitor_Base& visitor)
{
visitor(*this);
}
};
struct Base_Long : public Base
{
void accept_visitor(Visitor_Base& visitor)
{
visitor(*this);
}
};
struct Base_Short : public Base
{
void accept_visitor(Visitor_Base& visitor)
{
visitor(*this);
}
};
struct Base_UInt : public Base
{
void accept_visitor(Visitor_Base& visitor)
{
visitor(*this);
}
};
struct Base_ULong : public Base
{
void accept_visitor(Visitor_Base& visitor)
{
visitor(*this);
}
};
struct Base_UShort : public Base
{
void accept_visitor(Visitor_Base& visitor)
{
visitor(*this);
}
};
现在奠定了基础,这就是踢球者的用武之地(模板化方法):
struct Visitor_Cout : public Visitor_Base
{
template <class Receiver>
void operator() (Receiver& r)
{
std::cout << "Visitor_Cout method not implemented.\n";
}
};
故意在方法声明Visitor_Cout
中不包含关键字。virtual
方法签名的所有其他属性都与父声明(或规范)匹配。
总体而言,这种设计允许开发人员实现仅因目标对象(接收访问的对象)类型不同而不同的通用访问功能。上面的实现是我对派生访问者实现未实现可选方法时的警报的建议。
这在 C++ 规范中合法吗?
(我不相信有人说它可以与编译器XXX一起使用。这是一个针对通用语言的问题。)