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



这是SFINAE的正确代码(演示):-

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>(演示)进行编译。

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

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

它仍然可以编译<false>!(演示)。

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

问:除了编译器警告,如何防止编码员在这种情况下出错?

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

相关内容

  • 没有找到相关文章

最新更新