首页 > 解决方案 > 删除一个模板函数,除了它的一个特化

问题描述

有时,与其删除特化,不如删除模板函数本身更方便,但要删除它的特化之一。

一个例子:

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

在模板参数推导的帮助下,在这里,我可以保证在不使用尖括号的情况下不会发生隐式转换。

char c='F';
IsLucky(c); // Will not compile

这种方法有什么缺点吗?

标签: c++c++17

解决方案


普通函数重载在这里工作得很好:

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 可能会大大减慢编译时间


推荐阅读