重新定义 std::hash 模板结构
Re-defining std::hash template struct
通常,如果新类型需要哈希,则必须std::hash
专用。我编写了一个测试哈希库,并希望将其用于标准库尚未专用的所有类型。
我用 gcc/4.9.3 和 clang/3.7.0 尝试了以下内容。令我惊讶的是,它有效。
#include <utility>
#include <functional>
#include <iostream>
namespace std {
template<typename T>
class hash
{
public:
size_t operator()(const T & obj)
{
return 99;
}
};
}
int main(void)
{
int i = 10;
std::pair<int, int> pi{22,33};
std::hash<int> hi;
std::hash<std::pair<int, int>> hpi;
std::cout << "Hash of int: " << hi(i) << "n";
std::cout << "Hash of int pair: " << hpi(pi) << "n";
return 0;
}
整数的哈希是整数本身(这是标准库版本(,该对的哈希为 99。
所以两个问题。
为什么它有效? 应该已经声明了
std::hash
的模板化版本。(我唯一的猜测是它位于更深的命名空间中,该命名空间被转发(这是标准行为吗?
编辑:对问题1的回答 - template<typename T> struct hash
被声明,但似乎没有在任何地方定义。这就是为什么我可以定义它。
17.6.4.2.1 命名空间标准 [命名空间.std]
1 如果C++程序将声明或定义添加到
namespace std
或namespace std
中的命名空间,除非另有规定 指定。程序可以为任何添加模板专用化 标准库模板仅在声明时namespace std
取决于用户定义的类型,并且专用化满足 原始模板的标准库要求,而不是 明确禁止。
由于您重新定义了已存在的通用模板,因此namespace std
,因此具有未定义的行为。这包括@T.C.在评论中提到的,该程序运行良好。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 什么是"#include <boost/functional/hash.hpp> "?
- 在 c++ 中拥有一组结构的正确方法是什么?
- 重新定义 std::hash 模板结构