使用std :: string的std :: hash专门化,无需构造字符串对象

时间:2019-02-09 13:43:15

标签: c++ cuda

我有一个广泛使用CUDA的代码库,不幸的是,到目前为止,它仅支持C ++ 14。但是,我仍然想使用string_view,它是C ++ 17的功能。该实现相对简单,尤其是因为我不需要“查找”功能。

但是,我确实需要哈希来工作。标准要求string_view的std :: hash必须等于从string_view构造的字符串的哈希(我打算依靠此保证)。是否有一种符合标准的方法来从std :: hash获取输出,而不必临时构造字符串对象,而字符串对象可能带有无法优化的堆分配(这是string-view-lite所经过的路线)?我宁愿不依赖于从具体的stdlib实现中复制算法,因为这将来可能会中断,或者已经中断了旧版本的编译。

或者,是否有一种方法可以让MSVC(EDIT:v14.16)在C ++ 14模式下使用std :: string_view,NVCC也可以识别该模式?如果Clang和GCC也有类似的选择,那就太好了,因为代码库有一天可能会从MSVC迁移出去。

1 个答案:

答案 0 :(得分:2)

在我看来,您很不走运,因为还假设您可以模仿内部结构并传递经过定制的对象来实现并看起来像std::string,那肯定比复制副本更加脆弱。实施。

我看到两个选择,或者:

  • 您复制了std::hash<std::string>专业化实现,并在硬编码的情况下添加了一些断言,如果任何更改或不同(可能是笨拙的解决方案),可能会警告您。

  • 您提供了自己的哈希函数,该哈希函数将覆盖std::string的哈希函数并将其作为模板参数传递,以便您可以在使用STL集合时强制使其相等。