if constexpr для оператора switch на основе шаблона - PullRequest
3 голосов
/ 25 июня 2019

У меня есть шаблон, подобный этому, который определяет код, специфичный для некоторых шаблонов:

template <typename T>
class CMyClass : public T
{

template<typename T>
inline void CMyClass<T>::SomeFunc()
{
    if constexpr(std::is_same_v<T, CSpecialClass>)
    {
        DoSpecialClassActions();
        //...
    }
    else
    {
        DoGenericActions();
        //...
    }
}


}

Но теперь мне интересно, могу ли я использовать подобное условие constexpr в операторе switch? (Для добавления дополнительных case операторов на основе шаблона.)

Примерно так (который не компилируется):

template<typename T>
inline void CMyClass<T>::SomeSwitchFunc()
{
    switch(message)
    {
        case 1:
            doMsg1();
            //...
            break;
        case 2:
            doMsg2();
            //...
            break;
        //...

        if constexpr(std::is_same_v<T, CSpecialClass>)
        {
        case 10:
            doMsg10();
            //...
            break;
        }
    }
}

}

PS. Я знаю, что могу разделить этот переключатель на два, но я не хочу этого делать, так как это помешает оптимизации компилятора.

Ответы [ 2 ]

3 голосов
/ 25 июня 2019

У меня нет авторитетного источника под рукой, но я боюсь, что это невозможно.

cppreference на if-заявлениях состояния:

Метки (цели перехода, метки регистра и значения по умолчанию :), появляющиеся в подзаголовке constexpr, если на них можно ссылаться (по ключу или goto) в одном подзаголовке.

3 голосов
/ 25 июня 2019

Чтение [stmt.if] говорит нам, что ваш код некорректен.Метка case в if constexpr может относиться только к переключателю, полностью заключенному в оператор if.

Метка case или default, встречающаяся в таком операторе if, должна быть связана с оператором switch внутриТо же, если заявление.Метка, объявленная в подстатеме constexpr if, на оператор должен ссылаться только на оператор в том же подстатеме.

Вы не можете иметь переходы в отброшенные операторы извне.Но вы можете пометить if constexpr сам, если это утешит.

...