我有一个类似于此模板的模板,它定义了一些模板的特定代码:
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。我知道我可以将此开关一分为二,但我不想这样做,因为它会阻碍编译器的优化。
答案 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目标,案例标签和默认值:)。