如果constexpr用于基于模板的switch语句

时间:2019-06-25 05:03:01

标签: c++ visual-studio-2017 c++17

我有一个类似于此模板的模板,它定义了一些模板的特定代码:

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();
        //...
    }
}


}

但是现在我很好奇我是否可以在switch语句中使用类似的constexpr条件? (要基于模板添加其他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 个答案:

答案 0 :(得分:3)

阅读[stmt.if]会告诉我们您的代码格式错误。 if constexpr中的case标签只能引用完全包含在if语句中的开关。

  

在此if语句中出现的案例或默认标签应为   与同一if语句中的switch语句关联。一种   如果声明应在constexpr的子语句中声明的标签   只能由同一子语句中的语句引用。

您不能从外部跳入丢弃的语句。但是,如果有任何安慰,您可以标记if constexpr本身。

答案 1 :(得分:3)

我手头没有权威消息,但我担心这是不可能的。

cppreference page on if-statements的状态:

  

如果只能在同一子语句中引用(通过switch或goto),则在constexpr的子语句中出现的标签(goto目标,案例标签和默认值:)。