带前向声明的 std::variant

Nik*_*ook 2 c++ c++17

我正在研究一个与此类似的简单状态机。

我正在尝试将我的状态编码在单独的类中,如下所示:

// class StateA; (1)
// class StateB; (2)

using State = std::variant<StateA, StateB>;

class StateA {
  State handle(/* some params */) { return StateB(); };
};

class StateB {
  State handle(/* some params */){ return StateA(); };
};
Run Code Online (Sandbox Code Playgroud)

现在我的变体对 StateA 和 StateB 一无所知,这会导致use of undeclared identifier 'StateA'. 如果我取消注释(1)和(2)并有一个前向声明,那么我得到incomplete type 'StateA' used in type trait expression

有没有办法让类有一个变体,其中有变体?

r3m*_*n0x 8

您需要确保两个variant成员在使用时都是完整类型,例如通过将handle方法的定义移到类之外:

#include <variant>

class StateA;
class StateB;

using State = std::variant<StateA, StateB>;

class StateA {
    State handle(/* some params */);
};

class StateB {
    State handle(/* some params */);
};

State StateA::handle() { return StateB(); }

State StateB::handle() { return StateA(); }
Run Code Online (Sandbox Code Playgroud)