以下是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 )。
我知道如何/为什么这是错的,但我经常在实践中犯这样的错误。
问题: 除编译器警告外,如何在这种情况下防止编码器错误?
答案 0 :(得分:2)
C ++ 14引入了std::enable_if_t
,它不允许犯这个错误,不再需要程序员明确地引用嵌套类型。您可以自行决定enable_if
根本不应再使用的代码,甚至可能在您自己的源代码中将其列入黑名单。