【发布时间】:2020-04-10 15:46:06
【问题描述】:
我有一个基类。目标是强制将 std::hash 用于 std::shared_ptr 与所有继承自 Base 的类。
我已经尝试了使用虚拟模板参数的以下方法,但编译器错误显然抱怨这是 struct std::hash<std::shared_ptr<_Tp>> 的重新定义。
class Base {
};
class Derived : public Base {
};
namespace std {
template<typename T,
typename std::enable_if<std::is_base_of<Base, T>::value, Base>::type* = nullptr
>
struct hash<std::shared_ptr<T>> {
size_t operator()(const std::shared_ptr<T>& d) const {
return 616;
}
};
}
我的问题是:是否可以像这样有条件地专门化 std 类?
【问题讨论】:
-
AFAIR 您不能将全部或部分专业化添加到
std。编辑:原来,你can。 “程序定义类型的 std::hash 特化必须满足 Hash 要求。”
标签: c++ template-specialization enable-if stdhash