C ++ рекурсивный вариационный шаблон в классе - PullRequest
0 голосов
/ 30 сентября 2018

Как я могу получить этот тип использования из моего компилятора C ++?Рассмотрим очень простой иерархический конечный автомат, где вы можете указать состояния уникальных перечислимых типов (перечислимый класс).Вот некоторый псевдокод варианта использования:

    enum class lev0
    {
        start,
        end
    };

    enum class lev1
    {
        start,
        end
    };

    enum class lev2
    {
        start,
        end
    };

    HSMSimple<lev0, lev1, lev2> hsm_lev0;
    const HSMSimple<lev1, lev2>& hsm_lev1 = hsm_lev0.nextLevel;
    const HSMSimple<lev2>& hsm_lev2 = hsm_lev1.nextLevel;

    switch (hsm_lev0)
    {
    case lev0::start:
        switch (hsm_lev1)
        {
        case lev1::start:
            switch (hsm_lev2)
            {
            case lev2::start:
                break;
            case lev2::end:
                break;
            }
            break;
        case lev1::end:
            break;
        }
        break;
    case lev0::end:
        break;
    }
    ...

Идеи?Я попробовал класс как таковой:

    template<typename arg1, typename ... TArgs>
    class HSMSimple
    {
    public:
        operator const arg1&() const { return m_lev1; }
        operator arg1() { return m_lev1; }

        const HSMSimple<TArgs>& nextLev() const { return m_nextLevel; }
        HSMSimple<TArgs> nextLev() { return m_nextLevel; }

    protected:
        arg1 m_lev1;
        HSMSimple<TArgs> m_nextLevel;
    };

Но компилятор говорит, что экземпляр должен упаковать аргументы в этой последней строке в классе.Когда я пытаюсь написать 'HSMSimple m_nextLevel;'только больше хаосаЯ чувствую, что нужно больше обмана, но не могу понять, что.

...