cal*_*vin 1 c++ templates template-specialization stdhash
我有一个C<B>继承自 的类模板std::string,我想让它像普通的 一样可散列std::string。我编写了以下代码,并且可以编译。
我想知道这是否是正确的实现。由于从派生类到基类的转换可能会截断内存,我想知道它是否会花费太多?
#include <unordered_set>
#include <string>
template <bool B>
struct C : std::string
{
C(std::string s) : std::string(s) {}
};
namespace std {
template <bool B>
struct hash<C<B>>
{
std::size_t operator()(const C<B> &k) const {
return std::hash<std::string>()(static_cast<std::string>(k));
}
};
} // namespace std
int main() {
std::unordered_set<C<false>> s;
std::string c = C<false>("a");
s.insert(c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,该实现可以工作,但static_cast<std::string>(k)不是必需的 - 并且会创建一个std::string您可能希望避免的临时对象。
如果您改为创建它static_cast<const std::string&>(k),则不会创建临时的std::string。如果你简单地做同样的事情:
std::size_t operator()(const C<B>& k) const {
return std::hash<std::string>()(k);
}
Run Code Online (Sandbox Code Playgroud)