与其删除特化,有时更方便删除模板函数本身,但为了它的一个特化。
一个例子:
template<typename T>
bool IsLucky(T) = delete;
bool IsLucky<int>(int n) {
return !(n%7);
}
// I guess bool IsLucky(int n) will not help my cause
在template argument deduction的帮助下, 在这里,我可以保证在不使用尖括号的情况下不会发生隐式转换。
char c='F';
IsLucky(c); // Will not compile
这种方法有什么缺点吗?
普通函数重载在这里工作得很好:
template<typename T>
bool IsLucky(T) = delete;
inline bool IsLucky(int n) {
return !(n%7);
}
int main() {
IsLucky(1);
IsLucky(1u); // error: use of deleted function ‘bool IsLucky(T) [with T = unsigned int]’
IsLucky('1'); // error: use of deleted function ‘bool IsLucky(T) [with T = char]’
}
作为旁注,从编译时间的角度来看,SFINAE may slow down compilation times considerably .
我是一名优秀的程序员,十分优秀!