1

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

4

0 回答 0