<i id='3xKV5'><tr id='3xKV5'><dt id='3xKV5'><q id='3xKV5'><span id='3xKV5'><b id='3xKV5'><form id='3xKV5'><ins id='3xKV5'></ins><ul id='3xKV5'></ul><sub id='3xKV5'></sub></form><legend id='3xKV5'></legend><bdo id='3xKV5'><pre id='3xKV5'><center id='3xKV5'></center></pre></bdo></b><th id='3xKV5'></th></span></q></dt></tr></i><div id='3xKV5'><tfoot id='3xKV5'></tfoot><dl id='3xKV5'><fieldset id='3xKV5'></fieldset></dl></div>

        • <bdo id='3xKV5'></bdo><ul id='3xKV5'></ul>
        <legend id='3xKV5'><style id='3xKV5'><dir id='3xKV5'><q id='3xKV5'></q></dir></style></legend>

        <small id='3xKV5'></small><noframes id='3xKV5'>

        <tfoot id='3xKV5'></tfoot>

      1. 如何为来自其他库的类型专门化 std::hash

        时间:2023-08-26

      2. <small id='y8G2a'></small><noframes id='y8G2a'>

          <tbody id='y8G2a'></tbody>
        <tfoot id='y8G2a'></tfoot>

          1. <legend id='y8G2a'><style id='y8G2a'><dir id='y8G2a'><q id='y8G2a'></q></dir></style></legend>
            <i id='y8G2a'><tr id='y8G2a'><dt id='y8G2a'><q id='y8G2a'><span id='y8G2a'><b id='y8G2a'><form id='y8G2a'><ins id='y8G2a'></ins><ul id='y8G2a'></ul><sub id='y8G2a'></sub></form><legend id='y8G2a'></legend><bdo id='y8G2a'><pre id='y8G2a'><center id='y8G2a'></center></pre></bdo></b><th id='y8G2a'></th></span></q></dt></tr></i><div id='y8G2a'><tfoot id='y8G2a'></tfoot><dl id='y8G2a'><fieldset id='y8G2a'></fieldset></dl></div>
              <bdo id='y8G2a'></bdo><ul id='y8G2a'></ul>

                • 本文介绍了如何为来自其他库的类型专门化 std::hash的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  所以我使用的库有一个枚举(假设它名为LibEnum).我需要有一个 LibEnumstd::unordered_set,但是我得到编译错误,没有专门的 std::hash 用于它.我可以轻松地编写它并只返回值的数量(第一个元素是 0,第二个元素是 1 等),但是我应该把这个专业化放在哪里,它应该是什么样子的?我无法修改库源.

                  So the library I use has an enum (say it's named LibEnum). I need to have an std::unordered_set of LibEnum, but I get compilation error that there is no specialized std::hash for it. I could easily write it and just return the number of value (first element is 0, second 1 etc), but where exactly I should put this specialization and how should it look like? I can't modify the library sources.

                    enum LibEnum { A, B, C, D};
                    std::unordered_set <LibEnum> mySet;
                    //need std::hash for LibEnum
                    //how should it look like?
                  

                  推荐答案

                  你可以专门针对你的类型std::hash:

                  You can just specialise std::hash for your type:

                  namespace std {
                      template <>
                      struct hash<FullyQualified::LibEnum> {
                          size_t operator ()(FullyQualified::LibEnum value) const {
                              return static_cast<size_t>(value);
                          }
                      };
                  }
                  

                  或者,您可以在任何您喜欢的地方定义 hash 类型,并在实例化 std::unordered_map 时将其作为附加模板参数提供::>

                  Alternatively, you can define a hash type where ever you like and just provide it as the additional template argument when instantiating std::unordered_map<FooEnum>:

                  // Anywhere in your code prior to usage:
                  
                  struct myhash {
                      std::size_t operator ()(LibEnum value) const {
                          return static_cast<std::size_t>(value);
                      }
                  };
                  
                  // Usage:
                  
                  std::unordered_map<LibEnum, T, myhash> some_hash;
                  

                  这两种方法都不需要您修改库.

                  Neither methods require you to modify the library.

                  这篇关于如何为来自其他库的类型专门化 std::hash的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:如何实现用于 std::unordered_map 的 CString 哈希函数? 下一篇:使用 Tensorflow 检查点在 C++ 中恢复模型

                  相关文章

                • <tfoot id='cnxgT'></tfoot>
                  • <bdo id='cnxgT'></bdo><ul id='cnxgT'></ul>

                    1. <legend id='cnxgT'><style id='cnxgT'><dir id='cnxgT'><q id='cnxgT'></q></dir></style></legend>
                      <i id='cnxgT'><tr id='cnxgT'><dt id='cnxgT'><q id='cnxgT'><span id='cnxgT'><b id='cnxgT'><form id='cnxgT'><ins id='cnxgT'></ins><ul id='cnxgT'></ul><sub id='cnxgT'></sub></form><legend id='cnxgT'></legend><bdo id='cnxgT'><pre id='cnxgT'><center id='cnxgT'></center></pre></bdo></b><th id='cnxgT'></th></span></q></dt></tr></i><div id='cnxgT'><tfoot id='cnxgT'></tfoot><dl id='cnxgT'><fieldset id='cnxgT'></fieldset></dl></div>

                      <small id='cnxgT'></small><noframes id='cnxgT'>