有时候,与其删除专业化信息,不如说它更方便 删除模板函数本身,但要删除其专门功能之一。
一个例子:
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
这种方法是否有缺点?
答案 0 :(得分:0)
纯函数重载在这里效果很好:
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。