c++ 参数包中每个的重写方法

jv4diomz  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(127)

我有以下课程:

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.从AbstractMessageVisitorGs中的每个组实现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和多余的表。

6qftjkof

6qftjkof1#

您可以基于GroupsVisitor的模板专用化进行一些递归。

template <Group... Gs>
class GroupsVisitor;

template <>
class GroupsVisitor<> : public AbstractMessageVisitor {};

template <Group First, Group ... Rest>
class GroupsVisitor<First, Rest...> : public AbstractGroupVisitor<First>, public GroupsVisitor<Rest...> {
public:
  void visit(GroupMessage<First>& msg) final {
    msg.accept(static_cast<AbstractGroupVisitor<First>&>(*this));
  }
};

class MyVisitor : public GroupsVisitor<Group::A, Group::B> {
};

MyVisitor myVisitor;

但我必须将AbstractGroupVisitor从正向声明改为具有类体:

template <Group G>
class AbstractGroupVisitor {};

否则,编译器会抱怨“类型不完整”。

相关问题