这是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
,甚至可以将其列入您自己的源代码中的黑名单。