我有以下课程:
enum class Group
{
A,
B
};
template <Group G>
class AbstractGroupVisitor;
template <Group G>
class GroupMessage;
class AbstractMessageVisitor;
class AbstractMessage
{
public:
virtual void accept(AbstractMessageVisitor& visitor) = 0;
};
class AbstractMessageVisitor
{
public:
virtual void visit(GroupMessage<Group::A>& msg) = 0;
virtual void visit(GroupMessage<Group::B>& msg) = 0;
//A pure virtual method for each item in the Group enum
};
template <Group G>
class GroupMessage:
public AbstractMessage
{
public:
void accept(AbstractMessageVisitor& visitor) final { visitor.visit(*this); }
virtual void accept(AbstractGroupVisitor<G>& visitor) = 0;
};
是否有一种方法可以编写如下的CRTP模板
template <Group... Gs>
class GroupsVisitor;
这将能够:
1.从AbstractMessageVisitor
继承
1.为Gs
中的每个组从AbstractGroupVisitor
继承
1.从AbstractMessageVisitor
为Gs
中的每个组实现visit
方法
如果我手动编写一个类,它看起来像:
class MyVisitor:
public AbstractMessageVisitor,
public AbstractGroupVisitor<Group::A>,
public AbstractGroupVisitor<Group::B>
{
public:
void visit(GroupMessage<Group::A>& msg) final { msg.accept(static_cast<AbstractGroupVisitor<Group::A>&>(*this)); }
void visit(GroupMessage<Group::B>& msg) final { msg.accept(static_cast<AbstractGroupVisitor<Group::B>&>(*this)); }
};
顺便说一句,我这样做是为了模拟虚拟继承的一些特性,而不需要为final类中的每个方法使用thunk和多余的表。
1条答案
按热度按时间6qftjkof1#
您可以基于
GroupsVisitor
的模板专用化进行一些递归。但我必须将
AbstractGroupVisitor
从正向声明改为具有类体:否则,编译器会抱怨“类型不完整”。