防止编码器错误 - 忘记添加" :: type" in" std :: enable_if<> :: type" (SFINAE)

时间:2017-05-14 08:28:34

标签: c++ c++14 sfinae

以下是SFINAE的正确代码( demo ): -

template<bool b> class C {
    public: template<bool b2=b> typename std::enable_if<b2,void>::type f(){
        cout<<"no!!";
    }
};
int main() {
    //C<false> c1; c1.f(); <-- not compilable (it is good)
    C<true> c2; c2.f();
    return 0;
}

我对C ++很陌生,但仍然不习惯它 因此,我经常忘记添加::type: -

    public: template<bool b2=b> std::enable_if<b2,void> f(){
        cout<<"no!!";
    }

不幸的是,即使它是错误的,也可以对<false> demo )进行编辑。

在我糟糕的一天,我甚至走得很远: -

    public: std::enable_if<b,void> f(){
        cout<<"no!!";
    }

<false>仍可编辑! (的 demo )。

我知道如何/为什么这是错的,但我经常在实践中犯这样的错误。

问题: 除编译器警告外,如何在这种情况下防止编码器错误?

1 个答案:

答案 0 :(得分:2)

C ++ 14引入了std::enable_if_t,它不允许犯这个错误,不再需要程序员明确地引用嵌套类型。您可以自行决定enable_if根本不应再使用的代码,甚至可能在您自己的源代码中将其列入黑名单。