如何轻松static_assert(false)
的{{1}}中的else{}
?
if constexpr
以上MCVE无法编译。
原因已在constexpr if and static_assert中进行了解释。
(这个问题更多是语言律师的问题。)
在这个问题上,我想知道一个优雅的解决方法。
The first workaround(将复制粘贴条件复制到#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
}
):-
#1
^它不太容易维护+肮脏。
My second attempt(缓存为 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
主要是关于检查指针的类型。