c++ - 删除一个模板函数,除了它的一个特化
问题描述
有时,与其删除特化,不如删除模板函数本身更方便,但要删除它的特化之一。
一个例子:
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
这种方法有什么缺点吗?
解决方案
普通函数重载在这里工作得很好:
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 可能会大大减慢编译时间。
推荐阅读
- php - Yii2 如何根据用户类型注销用户
- julia - ArgumentError: No key column found Unstack Error?
- javascript - 如何使用 javascript 处理启动应用程序确认框
- node.js - nodejs中引入的生成器和yield关键字是什么版本?
- python - Pandas 数据帧中的条件丰富
- java - 如何将处理器映射到 dto
- database - 在 Google Cloud Spanner 中定义具有不同外键的交错表
- polymorphism - JOOQ:如何以多态方式最好地访问列?
- c# - 来自 Web API 的响应:无法加载资源:ERR_CONNECTION_CLOSED
- elasticsearch - Elasticsearch 解析不同格式的日期字段