假设我有一个简单的布尔特征类,
我也尝试过将所有的局部特化内容放在#后面,但是这样会出现一个错误信息,指出
有没有办法做到这一点?至少SO上以前的一个问题表明没有:Specializing std::hash to derived classes。
无论是解决方案还是明确的“否”,后跟简要说明都是一个很好的答案。
MyTrait
。也就是说,对于任何类型T
,我可以执行MyTrait<T>::value
并获取true或false。我想为所有类型T
,其中MyTrait<T>::value
为true,专门定制std::hash
。有没有办法做到这一点?以下是一些失败的尝试:template <class T, typename std::enable_if<
MyTrait<T>::value, int
>::type = 0>
struct hash<T> {
...
}
失败的原因:
error: default template argument in a class template partial specialization
我也尝试过将所有的局部特化内容放在#后面,但是这样会出现一个错误信息,指出
T
处于无法推断的上下文中。有没有办法做到这一点?至少SO上以前的一个问题表明没有:Specializing std::hash to derived classes。
无论是解决方案还是明确的“否”,后跟简要说明都是一个很好的答案。
std::hash
只有一个模板参数,因此您可以进行的唯一类型的部分特化是例如template<typename T> struct hash<unique_ptr<T>> { ... }
。我没有看到任何方法来引起替换失败以禁用特化。 - melak47std::unordered_map
等提供自定义散列类型,您可以自由地为其配备一个虚拟的模板参数,以供特化使用。 - melak47