static_assert(false)的实际解决方法;在其他constexpr {}中

时间:2019-03-05 12:20:51

标签: c++ c++17 static-assert if-constexpr

如何轻松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主要是关于检查指针的类型。

0 个答案:

没有答案