如何轻松static_assert(false)
inelse{}
的if constexpr
?
#include <type_traits>
#include <iostream>
class B{};
class C{};
class D{};
template<class T> void complexIf(){
if constexpr(std::is_same_v<T,B>){
//^ actually it is some complex statement
std::cout<<"1"<<std::endl;
}else if constexpr(std::is_same_v<T,C>){
//^ another uber complex thingy
std::cout<<"2"<<std::endl;
}
//another 4-5 "else if constexpr(){}"
else{//#1
static_assert(false);
}
};
int main(){
complexIf<B>();// should compliable
//complexIf<D>() should uncompliable
}
上述 MCVE 不可编译。
原因在constexpr if 和 static_assert中进行了解释 。
(这个问题更像是语言律师的问题。)
在这个问题中,我想知道一个优雅的解决方法。
我糟糕的解决方案
第一个解决方法(将条件复制粘贴到#1
):-
else{//#1
static_assert(std::is_same_v<T,B> &&std::is_same_v<T,C> );
//^ a ton of copy-paste condition
}
^ 它不易维护+脏。
我的第二次尝试(缓存为constexpr bool
):-
template<class T> void complexIf(){
constexpr bool case1=std::is_same_v<T,B>;
constexpr bool case2=std::is_same_v<T,C>;
if constexpr(case1){
//^ actually it is some complex statement
std::cout<<"1"<<std::endl;
}else if constexpr(case2){
//^ another uber complex thingy
std::cout<<"2"<<std::endl;
}
//another 4-5 "else if constexpr(){}"
else{//#1
static_assert(case1&case2 );
}
}
^ 它不太清楚而且相当混乱。
在现实世界中,complexIf
是一个管理自定义智能指针的功能。
每个if constexpr
主要是关于检查指针的类型。