gpt4 book ai didi

c++ - 为类模板的枚举成员定义 std::hash

转载 作者:太空狗 更新时间:2023-10-29 20:55:31 24 4
gpt4 key购买 nike

假设我们有以下类:

template <int i>
class S {
public:
enum class E : signed char {a, b, c};
// ...
};

现在我想要一个 E 的哈希函数。以下工作:

namespace std {
template<>
struct hash<typename S<3>::E> {
size_t operator()(typename S<3>::E const& e) const { return 0; }
};
}

但如果我将其设为通用,则不会:

namespace std {
template<int i>
struct hash<typename S<i>::E> {
size_t operator()(typename S<i>::E const& e) const { return 0; }
};
}
// error C2764: 'i': template parameter not used or deducible in partial specialization 'std::hash<S<i>::E>'

我如何确保始终能够为所有 i 哈希 S::E?

最佳答案

typename S<3>::E表示特定类型。声明 std::hash 的显式特化是可以的对于那种类型。如果该类型曾经用作 std::hash 的模板参数,那么将使用您的显式特化。

另一方面,你的偏特化是不可能的

template<int i>
struct hash<typename S<i>::E>

可以永远使用。正如错误所说,i不可推导。对于任何给定的 T ,编译器无法确定是否 std::hash<T>应该使用你的偏特化,因为它无法判断是否存在 i这样 typename S<i>::ET 的类型相同.如果i在推导上下文中使用,例如:

template<int i>
struct hash<S<i>>

它会有所不同,因为这样编译器就可以简单地尝试推断出 i .编译器可以确定给定类型是否为 S<i>其中 S是它已知的模板。如果TS<i>对于一些 i ,则推导成功,否则推导失败并忽略特化。在非推导上下文中,编译器无法判断。

如何修复?如果E是类类型,我建议将其设为不会嵌套在 S 中的模板.然后你可以专攻std::hash对于 E<i> .但是,您不能有枚举模板,所以不行了。您可能只有一个非模板枚举和该类型的哈希特化,然后有 S<i>::E是所有 i 的那个枚举的 typedef .如果您不希望用户依赖 S<i>::E 的事实所有 i 都是同一类型, 你可以只说 S<i>::E 的定义未指定。

关于c++ - 为类模板的枚举成员定义 std::hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com